消息生存时间 (TTL)

在 Pub/Sub 消息中使用生存时间。

介绍

Dapr 允许对每个消息设置生存时间(TTL)。 这意味着应用程序可以为每个消息设置生存时间,并且在过期后订阅者将不会收到这些消息。

所有Dapr pub/sub组件都与消息TTL兼容,因为Dapr在运行时内处理TTL逻辑。 只需在发布消息时设置 ttlInSeconds 元数据。

在一些组件中,例如Kafka,可以根据文档通过retention.ms在主题中配置消息的存活时间。 在 Dapr 中使用 TTL 消息时,使用 Kafka 的应用程序现在除了每个主题外,还可以设定每条消息的 TTL。

本机消息 TTL 支持

当消息的 TTL 在 Pub/Sub 组件中得到本机支持时,Dapr 仅仅 TTL 的配置,不会增加任何额外的逻辑,保持可预见的行为。 当组件以不同方式处理过期消息时,这是很有帮助的。 例如,使用 Azure Service Bus 时,过期的消息存储在死信队列中,而不仅仅是删除。

注意

您还可以在创建时为给定的消息代理设置消息 TTL。 根据你正在使用的组件的具体特性,看看这是否合适。

受支持的组件

Azure Service Bus

Azure Service Bus支持实体级别的生存时间。 这意味着消息有默认的 TTL,但也可以在发布时间设置更短的时间。 Dapr 会为消息传播 TTL 元数据,并允许 Azure Service Bus 直接处理过期时间。

非 Dapr 订阅者

如果订阅者不使用 Dapr 消费消息,则不会自动丢弃过期消息,因为过期时间是通过 Dapr 运行时在 Dapr sidecar 收到消息时处理的。 然而,订阅者可以通过在云事件中添加逻辑来处理 expiration 属性,以编程方式删除过期消息,该属性遵循RFC3339格式。

当非 Dapr 订阅者使用 Azure Service Bus 等组件时,也就是在本机处理消息 TTL,就收不到过期的消息。 在这方面,不需要额外的逻辑。

如何使用Dapr扩展来开发和运行Dapr应用程序

消息 TTL 可以设置在元数据中,作为发布请求的一部分:

  1. curl -X "POST" http://localhost:3500/v1.0/publish/pubsub/TOPIC_A?metadata.ttlInSeconds=120 -H "Content-Type: application/json" -d '{"order-number": "345"}'
  1. from dapr.clients import DaprClient
  2. with DaprClient() as d:
  3. req_data = {
  4. 'order-number': '345'
  5. }
  6. # Create a typed message with content type and body
  7. resp = d.publish_event(
  8. pubsub_name='pubsub',
  9. topic='TOPIC_A',
  10. data=json.dumps(req_data),
  11. publish_metadata={'ttlInSeconds': '120'}
  12. )
  13. # Print the request
  14. print(req_data, flush=True)
  1. <?php
  2. require_once __DIR__.'/vendor/autoload.php';
  3. $app = \Dapr\App::create();
  4. $app->run(function(\DI\FactoryInterface $factory) {
  5. $publisher = $factory->make(\Dapr\PubSub\Publish::class, ['pubsub' => 'pubsub']);
  6. $publisher->topic('TOPIC_A')->publish('data', ['ttlInSeconds' => '120']);
  7. });

请参阅 本指南 以获取关于Pub/sub(发布/订阅)API的参考。

下一步