前言:随着RocketMQ 5.0预览的发布,5.0的主要特征逐渐与您相遇。作为5.0的主要功能,流行消费者显示了新的消费模型。对于新闻和流媒体消费场景的积压场景非常友好。在引入POP消费之前,让我们回顾当前使用的当前推动消费者。
简介:流行消费者 - 使客户变得无状态和更轻!
作者:Kaiyi和Yun Tian
熟悉RocketMQ的学生绝对不会对推动消费者不熟悉。客户消费通常使用此消费模型,并且这种消费模型相对简单。我们只需要简单地设置它,然后在回调方法消耗中编写业务逻辑。启动客户端应用程序可以正常消费。
那么,推动消费者如何消费消息?
当然,消费者收到消息的前提是生产者向主题发送了一条消息。生产者通过旋转将消息发送给每个队列。通常,有一个以上的消费者一面。当客户端启动时,负载平衡将发生在主题和消费者组维度中。在负载平衡过程中,每个客户端将获得所有消费者和所有队列并对其进行排序。每个客户使用相同负责的平衡算法,例如平均分销算法,以便每个客户都会计算出他们需要消费那些需要消费那些需要消费的人需要消费那些需要消费的人的人在需要消费需要食用的人中,每当消费者增加或减少时,触发负载平衡就会触发,因此我们可以通过RocketMQ负载平衡机制实现动态容量的扩展,并增强客户的接收消息能力。
这里有一个小问题:您能始终增加客户数量以增加消费能力吗?当然不是,因为一旦客户数量达到队列的数量,队列的数量是有限的,然后扩展了新节点,它无法提高消费能力,因为没有任何节点可以分配队列并且不能消耗。
客户对客户端的队列分配均衡后,客户将不断地将消息拉到经纪人并在客户端上消费。这不是推送客户吗?客户端如何将消息拉到经纪人,不应该它是经纪人将消息推向客户端吗?这是一个非常有趣的观点,因为RocketMQ是推动消费者,或者吸引消费者,或者稍后将引入流行消费者。Push只能通过客户的包装来推动Ply Fightime Fighume Fighume Fighume Fight of Fige。等级。
客户负载平衡和拉消息后,客户可以正常食用新闻。
完整的推动消费者处理逻辑可以看到上面的图片。我们可以看到推动消费者的完整处理过程。
首先,客户的仰卧起见是要处理问题的问题,然后通过pullmessageservice服务拉消息。绘制消息后,消费者服务将提交消费者线程池,然后调用回调方法。业务是业务,最终消费成功地更新了本地办公室并向办公室报告给经纪人。如果消费失败(异常,超时等)。由于某些消费失败的消息,它不会影响普通消息的消耗。想要了解详细信息的学生可以访问Github下载源代码以查看实际的代码处理过程。
通过较早的推出消费者的引入,我们对推动消费者原则有一定的了解。我们可以发现,RocketMQ的客户已经做了很多事情,负载平衡,消息,消费者网站管理,消费失败后的寄存等等等等on。毫无疑问,这对于多语言支持是不友好的。参与过多语言的学生应该受同一身体的影响,这不是一个简单的事情,可以将如此多的逻辑移植到不同语言。同时,客户的升级是操作和维护也会增加难度。
因此,我们认为不要为客户减肥,并将某些逻辑从客户转移到经纪人?当然,当推动消费者客户负责平衡时,我们可以找到负载平衡所需的信息,所有消费者最初都是由客户从经纪人获得的所有队列信息,也可以通过名称服务器获得所有队列信息,经纪人也可以通过名称服务器获得。因此,这是一个很好的选择,将重新平衡移植到经纪人中。语言实施更简单,随后的升级操作和维护将更加可控。此外,由于经纪人与客户相比具有全局信息,因此您也可以做一些有趣的事情。例如,当负责平衡时,将根据队列的积压做出负载平衡,而客户的某些队列则分配给其他客户的压力相对较大。
通过推出推动消费者,我们学到了推动消费者的一些特征。
上述特征可能会带来一些问题,例如客户的异常机器挂起,这会导致分销队列消息积累并且无法消耗。
RocketMQ的推动消费者消费在机器中异常不太友好。如果您遇到客户机器悬挂,则在半死的状态下,当带有经纪人的心跳没有破坏时,客户的重新持续时间仍会在消费台上分配消费式排队。悬挂机,悬挂机的消耗非常缓慢甚至无法消耗。它会累积消耗。此外,当释放服务器经纪人时,由于客户的多重重新平衡效果,也将不可避免以下:
当推动消费者2机器发生时,经纪人分发的Q2累积了。我们目前正在处理此类问题,通常可能会发现该机器可以重新启动或离线。通过异常机器,但是如果在一定程度上挤压队列,则可以恢复机器,并且无法快速赶上消费进度。这也受到推动消费者能力的限制。
我们总结了推动消费者的一些疼痛点:
基于上述问题,RocketMQ 5.0实现了新的消费模型流行消费者。
流行消费者可以解决上述稳定性和提升队列的扩展能力。
让我们简要介绍一下POP消费如何消耗消息:
POP客户端从经纪人队列发送了一个POP请求消息,然后代理返回消息。在消息的系统属性中,有一个更重要的属性称为POP_CK。POP_CK是消息的处理程序。它可以通过处理程序找到消息。当消息消耗成功时,POP客户端将发送Ackmessage并通过处理程序以确认消息消耗到经纪人。
对于消息的新闻,当pop出现消息时,该消息将输入一个看不见的时间,并且在此期间不会弹出。然后,在看不见的时间之后,此消息将再次可见。
此外,为了重试消息,我们的重试策略是梯度的延迟时间,而重试的间隔逐渐增加。因此,还有一个Changeinvibsiletime可以修改不可见的信息。
从数字可以看出,该新闻在此期间将再次可见,但是我们会提前使用ChangeInvisibletime来扩展可见之前的隐形时间,从而延迟了此消息的可见时间。返回重新支出或异常,我们可以通过更改重试时间的重试数来修改下一个可见时间。加法,如果消费RT超过30秒(默认值,可以修改),则经纪人也将将消息放在审判队列中。
此外,流行消费的站点由经纪人存储和控制,流行消费可以在多个客户中消耗相同的队列,如下图所示:
这三个客户不需要重新平衡来分配队列。取而代之的是,他们将使用POP要求所有经纪人获取用于消费的消息。即使POP消耗2出现挂起,内部消息将使Pop Consumer1和pop coptumumer3消费量。这解决了悬挂机可能导致的消费累积问题。
从整体过程中可以看出,流行消费可以避免重新启动消费者的延迟,并且客户可以消耗经纪人的所有队列,从而避免机器挂起引起的积累问题。
同时,扩展能力得到了提高。流行消费者可以在同一主题下消耗所有队列。与推动消费者相比,客户端必须需要每个队列的限制。POP消费者可以突破此限制,并且多个POP消耗可以消耗相同的队列。
在经纪人方面,流行消费者如何实现?
流行消费者拉消息后,它将被锁定在队列维度上,以确保只有一个客户可以同时拉到相同的队列消息。获取消息后,将保存检查点信息在经纪人中,检查点信息,检查点信息主要包括消息的信息,消费者组,队列,办公室,弹出时间,MSGCOUT,REVIVEQUEUEID和其他信息。检查在缓冲区中保存在缓冲区中,等待ACK消息并在一段时间内从客户端响应中接收ACK消息。从缓冲区中删除相应的检查点信息,并更新消费进度以识别消费。
当检查点消息在缓冲区中等待一段时间,并且在没有ACK消息之前,检查点信息将清理缓冲区并将CK MSG发送到商店。CK MSG首先发送到延迟队列schedule_topic_xxxx.revive_log主题是一条消息,该消息存储在商店中要处理的CK MSG和ACK MSG主题中。Popremeveservice拉动revive_log主题。如果CK具有相应的ACK,它将更新Revive_log消费者网站,指示尚未确认的信息消费者completer.com,CK MSG(尚未得到确认)将查询与CK MSG相对应的真实消息,并将新闻放在重演中,等待客户消费。当流行消费者正常消费时,从这种设计中,我们可以看到RocketMQ的常用设计。通过一些内部主题,业务逻辑,交易消息和定时消息使用此设计方法。
让我们简单地结束流行消费者的优势:
现在,流行音乐有很多优势,我们可以使用pop解决一些推动问题吗?如前所述,当队列由于消费者而累积很多时,推动消费者,它仅限于单个消费者的消费能力,并且它无法快速赶上消费进度,延迟将是很高的。核心问题是单队列和单个消费者的极限,这使得消费能力无法水平扩展。
我们希望通过Popapi的形式,当队列堆积得太多时,我们可以切换到POP模式,以便有机会允许多个消费者将队列一起度过并赶上进度。我们还实现了5.0。
流行/推动模式切换方法
可以通过两种方式切换。
1.命令行
2.代码切换
通过以下流行消费者演示,我们看到流行消费者和推动API基本上是统一的,并且使用相对简单。与推送API相比,只有一个步骤消耗模式开关。
Push&Pop重试队列差异
使用POP消耗模式时,我们只需要根据推动API进行切换模式。对于经纪人,我们仍然需要进行一些处理。要处理的主要场所是重试队列。
推动和流行模式与重试队列不同
模式开关后,需要处理旧模式下的消息,否则将丢失消息。
推动和流行开关
推动开关到POP
流行开关
总而言之,对于重试队列,我们将特别处理不参与模式的切换。
最后,我们总结了POP消费。作为一种全新的消费模型,POP解决了推动模型的一些痛点,使客户没有状态,更轻和消费者的逻辑。消费者逻辑基本上已经融合到经纪人,这对多语言支持非常友好。在API级别,它也与推送融合,继承了简单易用的推动API,同时实现了免费切换在推动和弹出之间。
资料来源:阿里巴巴云