更新时间:2025-01-24 09:06:05下载pdf
涂鸦物联网消息队列 是基于开源消息组件 Apache Pulsar 并适配涂鸦业务场景而深度定制的消息中间件,对于 Pulsar 的许多特性都有保留。
Topic 是涂鸦物联网消息队列下生产消费的主体,订阅等同于 Topic 下的一个消费组,同一个订阅下,一条消息只会被一个消费者消费确认一次。云项目下开启 消息订阅 时,系统会自动创建 Topic 和一个默认的订阅。
Pulsar 集群至少由三部分组成:
{persistent|non-persistent}://tenant/namespace/topic
持久化主题|非持久化主题://租户/命名空间/主题
tenant
:默认为当前云项目的 accessId
/clientId
。namespace
:默认为 out
。topic
:生产通道 Topic 是 event
,也是分区 Topic,11 个分区。测试通道 Topic 是 event-test
,为非分区 Topic。tenant-suffix
tenant
:默认为当前云项目的 accessId
/clientId
。suffix
:订阅名的后缀,默认情况下是 sub
。Pulsar Topic 分为分区 Topic 和非分区 Topic:
Pulsar 支持四种订阅模式:Exclusive、Failover、Shared、和 Key_Shared。
Exclusive:同一个订阅下,只允许单个消费者连接到该订阅。如果多个消费者使用同一个订阅来订阅 Topic,则会发生错误。请注意,如果 Topic 是分区的,则所有分区都将由允许连接到订阅的单个消费者消费。
适用于全局有序的消息,但如消费能力有限,不推荐此订阅方式。
Failover:在故障转移类型中,多个消费者可以添加到同一个订阅。但同一时间,对于非分区 Topic 或分区 Topic 的每个分区,只有一个主消费者能接收消息。当主消费者断开连接时,所有未确认和后续新消息将被传递给下一个消费者。
对于分区 Topic,Broker 代理根据优先级和消费者名称的字典顺序对消费者进行排序。
acknowledgeCumulative
一起使用。acknowledgeCumulative
是一种批量确认机制,它意味着该消费者同时确认了该消息之前的所有未确认消息。消费者大于分区情况
消费者小于分区情况
Shared:在该模式下,多个消费者可以添加到同一个订阅。消息以循环方式在消费者之间传递,任何给定的消息都只传递给一个消费者。当消费者断开连接时,所有发送给它但未确认的消息将重新安排发送给剩余的消费者。
Shared 订阅模式不保证消息排序且不支持累积确认。
![Shared.png](https://images.tuyacn.com/content-platform/hestia/17367592783f589cf74e5.png"图片来自 Pulsar 官方文档")
Key_Shared:多个消费者可以添加到同一个订阅。消息在消费者之间分布传递,具有相同 Key 或相同排序 Key 的消息仅传递给一个消费者。无论消息重新传递多少次,它都会传递给同一个消费者。
allowOutOfOrderDelivery
来禁用有序性,从而保证新消费者能立即消费消息。消息订阅 生产通道都是分区 Topic,默认分区是 11。
acknowledgeCumulative
来确认消息,减少异常场景某些消息未 ACK 导致消费堆积。少量的消息堆积是正常现象,消息在生产者 -> Pulsar -> 消费者过程中,可能有少量的消息未确认,这部分未到消费者端或者消费者端未确认的消息会被统计为堆积。通常消息生产速度均匀的情况下,可能是毫秒到几秒的消息堆积。
大量的消息堆积可能是消费速度跟不上,在生产环境默认情况下,启动 11 个 Pulsar 消费者 可以达到最大消费速率。如果消费者已经超过 11 个,这时候可以通过添加日志,监控工具等观察本地业务处理逻辑耗时。发现瓶颈,修改消费代码。
如果消费速度和生产速度持平,但还是有堆积,可以尝试重启本地消费服务,或检查消费逻辑,是否有场景可能导致一些消息无法被 ACK。
Pulsar 不支持广播类型的订阅消费模式,即无法用同一个订阅,让所有的消费者都收到相同的消息。如果需要启动多个消费者,且多个消费者都收到相同的消息。建议开发者单个订阅接收消息,消费者收到消息后,代码里自行实现分发逻辑。
该内容对您有帮助吗?
是意见反馈该内容对您有帮助吗?
是意见反馈