原文链接:https://www.hezebin.com/article/66ac53f04379b36dec11a19b
概述
Pulsar是一个多租户、高性能的服务器到服务器消息传递解决方案。
Pulsar的主要特点如下:
- 原生支持Pulsar实例中的多个集群,跨集群无缝复制消息。
- 非常低的发布和端到端延迟。
- 无缝扩展到超过一百万个主题。
- 简单的 客户端API 支持 Java, Go, Python 和 C++.
- 多 订阅类型 (exclusive, shared, and failover)的 topic。
- 保证消息传递, 持久信息存储 提供 Apache BookKeeper. 一个无服务器的轻量级计算框架 Pulsar Functions 提供流原生数据处理能力。
- 基于Pulsar Functions构建的无服务器连接器框架Pulsar IO可以更轻松地将数据移入和移出Apache Pulsar。
- 分层存储在数据老化时将数据从热/温存储卸载到冷/长期存储(如S3和GCS)。
概念
Message 消息
Pulsar是建立在订阅模式(通常缩写为pub-sub)上的。在此模式中,生产者将消息发布到主题;消费者订阅这些主题,处理传入的消息,并在处理完成时将消息创建订阅后,Pulsar会保留所有消息,即使消费者断开连接也是如此。只有当使用者确认所有这些消息都已成功处理时,才会丢弃保留的消息。

如果消息的消费失败,并且您希望再次消费该消息,则可以启用消息重新交付机制来请求代理重新发送该消息。
消息是Pulsar的基本“单位”。它们是生产者发布到主题的内容,然后消费者从主题中消费。下表列出了消息的组成部分。
组件 | 描述 |
---|---|
Value / data payload | 报文中携带的数据。所有脉冲星消息都包含原始字节,尽管消息数据也可以符合数据模式。 |
Key | 消息的键(字符串类型)。它是消息键或分区键的简称。消息可以选择使用键标记,这对于主题压缩等特性很有用。 |
Properties | 用户定义属性的可选键/值映射。 |
Producer name | 生成消息的生产者的名称。如果不指定生产者名称,则使用默认名称。 |
Topic name | 消息要发布到的主题的名称。 |
Schema version | 用于生成消息的架构的版本号。 |
Sequence ID | 每个脉冲星消息都属于其主题的有序序列。消息的序列ID最初由其生产者分配,指示其在该序列中的顺序,也可以自定义。 序列ID可用于消息重复数据消除。如果brokerDeduplicationEnabled 设置为true ,则每个消息的序列ID在主题(未分区)或分区的生产者中是唯一的。 |
Message ID | 消息的消息ID由博彩公司在消息被持久存储后立即分配。消息ID表示消息在分类账中的特定位置,并且在Pulsar集群中是唯一的。 |
Publish time | 发布消息时的时间戳。时间戳由生产者自动应用。 |
Event time | 由应用程序附加到消息的可选时间戳。例如,应用程序在处理消息时附加一个时间戳。如果事件时间未设置任何内容,则值为0 。 |
消息的默认最大大小为5 MB。您可以使用以下配置选项配置消息的最大大小。
-
在
broker.conf
文件中。# The max size of a message (in bytes). maxMessageSize=5242880
-
在
broker.conf
文件中。# The max size of the netty frame (in bytes). Any messages received larger than this value are rejected. The default value is 5 MB. nettyMaxFrameSizeBytes=5253120
Pulsar中的
nettyMaxFrameSizeBytes
和maxMessageSize
是两个与消息大小相关的配置,但它们作用的层面和目的不同。
nettyMaxFrameSizeBytes
是指Netty服务器在处理客户端请求时可以接受的最大帧大小。Pulsar使用Netty作为其网络通信框架,该配置用于限制可以通过网络传输的数据帧的大小。如果客户端尝试发送超过此大小的数据帧,将会被Netty服务器拒绝,并可能返回一个错误给客户端。这个设置是为了防止客户端发送过大的数据帧,以免造成服务器的内存溢出。
maxMessageSize
则是指Pulsar内部可以处理的最大消息大小。这个配置限制的是客户端可以发布到Pulsar主题的单个消息的最大大小。如果消息超过了这个大小,将会被Pulsar服务器拒绝,并且客户端会收到一个错误消息。这个限制是为了确保Pulsar集群的稳定性和可维护性。总的来说,
nettyMaxFrameSizeBytes
更多地是关注网络层面上的安全和效率,而maxMessageSize
则关注的是消息队列层面的数据处理能力。在配置这些参数时,需要考虑到实际的应用场景,保证Pulsar系统能有效稳定地处理大量不同大小的消息。
Ack
在消费者成功消费消息之后,消费者向代理发送消息确认。然后,这条已使用的消息将被永久存储,只有在所有订阅都确认它之后才能删除。确认(ack)是Pulsar知道消息可以从系统中删除的方式。如果要存储已被消费者确认的消息,则需要配置消息保留策略。
可以通过以下两种方式之一来确认消息:
-
被个别承认
使用单独的确认,消费者确认每个消息并向代理发送确认请求。
-
累计确认
累积确认方式。使用这种方式,当你确认消息4时,你实际上是告诉Pulsar所有小于或等于4的消息都已被处理,即1, 2, 3, 4都视为被消费。它假设消费者以顺序方式处理消息,并且一次对多条消息进行确认,这可以减少确认消息所需的网络通信次数,从而提高处理效率。
如果您想单独确认消息,可以使用以下API。
consumer.acknowledge(msg);
如果您想累积确认消息,可以使用以下API。
consumer.acknowledgeCumulative(msg);
在共享订阅类型中不能使用累积确认,因为共享订阅类型涉及多个可以访问同一订阅的使用者。在共享订阅类型中,消息单独确认。
Nack
与之相反的 Nack 否定确认机制允许您向代理发送通知,指示使用者未处理消息。当使用者无法使用消息并需要重新使用该消息时,使用者会向代理发送否定确认 (nack),从而触发代理将此消息重新传递给使用者。
根据消费订阅类型,单独或累积地对消息进行否定确认:
- 在独占和故障转移订阅类型中,使用者仅以否定方式确认他们收到的最后一条消息。
- 在“共享”和“Key_Shared”订阅类型中,使用者可以单独否定地确认消息。
Ack timeout
默认情况下,Ack timeout 处于禁用状态,这意味着除非使用者崩溃,否则不会重新发送传递给使用者的消息。
确认超时机制允许您设置客户端跟踪未确认消息的时间范围。在此确认超时 ( ackTimeout
) 期限之后,客户端向代理发送 redeliver unacknowledged messages
请求,因此代理将未确认的消息重新发送给使用者。
- 如果启用了批处理,则一个批处理中的所有消息都将重新传递给使用者。
- 与Ack timeout相比,Nack是首选。首先,设置超时值很困难。其次,当消息处理时间超过确认超时时,代理会重新发送消息,但这些消息可能不需要重新使用。
Retry Topic
该功能允许您存储使用失败的消息,并在以后重试使用它们。使用此方法,您可以自定义重新传递消息的时间间隔。原始主题的使用者也会自动订阅重试信主题