当前位置:首页 > 科技  > 软件

基于Topic的消息发布与消费模式

来源: 责编: 时间:2023-11-07 17:16:38 371观看
导读闲话朋友们,好久不见,不知道你们最近怎样,但相信你们一定都挺好。已经有一段时间没有更新了,个中原因不好细说,但是归根结底也许是自己懒。这个不好,大家不要学。今天主要就是想分享一下关于消息处理机制的一些想法。基本概

闲话

朋友们,好久不见,不知道你们最近怎样,但相信你们一定都挺好。已经有一段时间没有更新了,个中原因不好细说,但是归根结底也许是自己懒。这个不好,大家不要学。今天主要就是想分享一下关于消息处理机制的一些想法。24m28资讯网——每日最新资讯28at.com

基本概念

24m28资讯网——每日最新资讯28at.com

1.Topic

同一个topic下消息的格式一致,例如topic为order-update-message消息的格式都是一个统一的OrderUpdateMessage的结构24m28资讯网——每日最新资讯28at.com

2.key主键

同一主键下的消息列表具有顺序性,例如key为订单号order-0001的消息列表(Queue)下,可能包含的消息列表(Queue)如下:24m28资讯网——每日最新资讯28at.com

OrderUpdateMessage(id="msg-0001", orderId = "order-0001", action="create", ...)OrderUpdateMessage(id="msg-0002", orderId = "order-0001", action="paid", ...)OrderUpdateMessage(id="msg-0003", orderId = "order-0001", action="delivering", ...)OrderUpdateMessage(id="msg-0004", orderId = "order-0001", action="modifying", ...)OrderUpdateMessage(id="msg-0005", orderId = "order-0001", action="delivered", ...)

3.Group消费者组

同一个topic下同一个group下的消费者,对这个group下的消息队列进行抢占式消费。例如同一个消费者组group-1下的消费者consumer-1和消费者consumer-2,以及另外一个消费者组group-2下的消费者consumer-3,消息消费的结果可能如下:24m28资讯网——每日最新资讯28at.com

// consumer-1消费的消息OrderUpdateMessage(id="msg-0001", orderId = "order-0001", action="create", ...)OrderUpdateMessage(id="msg-0002", orderId = "order-0001", action="paid", ...)// consumer-2消费的消息OrderUpdateMessage(id="msg-0003", orderId = "order-0001", action="modified", ...)OrderUpdateMessage(id="msg-0004", orderId = "order-0001", action="delivering", ...)OrderUpdateMessage(id="msg-0005", orderId = "order-0001", action="delivered", ...)// consumer-3消费的消息OrderUpdateMessage(id="msg-0001", orderId = "order-0001", action="create", ...)OrderUpdateMessage(id="msg-0002", orderId = "order-0001", action="paid", ...)OrderUpdateMessage(id="msg-0003", orderId = "order-0001", action="modified", ...)OrderUpdateMessage(id="msg-0004", orderId = "order-0001", action="delivering", ...)OrderUpdateMessage(id="msg-0005", orderId = "order-0001", action="delivered", ...)

Kafka的消息处理机制就是以这样的形式实现的。24m28资讯网——每日最新资讯28at.com

4.优势 

生产者和消费者完全解耦,生产者无需关注是否有消费者在消费,消费者也无需知道生产者是否在生成新的消息。24m28资讯网——每日最新资讯28at.com

生产者只关注消息是否成功的发送到消息处理中间件,消费者只关注能否从消息处理中间件消费到消息。24m28资讯网——每日最新资讯28at.com

消费者可以按组消费,同组内的消费者进行抢占式消费。24m28资讯网——每日最新资讯28at.com

RabbitMq中的优秀实践

1.RabbitMq消息处理机制

24m28资讯网——每日最新资讯28at.com

生产者讲带有指定RoutingKey的消息发送到对应的Exchange上,Exchange通过Binding定义的路由规格,将消息按照BindingKey分发到不同的Queue上,消费者从Queue拉取消息消费。24m28资讯网——每日最新资讯28at.com

  • Exchange & RoutingKey & Topic:RoutingKey决定了消息会被发送到哪个Exchange上,这和topic是类似的概念。
  • Bind & BindingKey & Group:Exchange根据Binding定义的路由规格,将消息按照BindingKey分发到不同的Queue上,这里可以认为是对应了Group的概念。
  • Queue & Group:Queue则是维护了一个Group下的某个队列下的所有消息。

优秀实践

因此如果要以RabbitMq实现基于Topic和Group实现的消息生产和消费的机制,可以将消息定义成以下类似的结构:24m28资讯网——每日最新资讯28at.com

// Exchange: {value="order-update", type="fanout"}// binding1: {value="promotion-service", bindingKey="order.*.paid"}// binding2: {value='inventory-service', bindingKey="order.*"}OrderUpdateMessage(id="msg-0001", orderId = "order-0001", action="create", ...)OrderUpdateMessage(id="msg-0002", orderId = "order-0001", action="paid", ...)OrderUpdateMessage(id="msg-0003", orderId = "order-0001", action="modified", ...)OrderUpdateMessage(id="msg-0004", orderId = "order-0001", action="delivering", ...)OrderUpdateMessage(id="msg-0005", orderId = "order-0001", action="delivered", ...)OrderUpdateMessage(id="msg-0006", orderId = "order-0002", action="paid", ...)

假设此时有promotion-service(1个实例)和inventory-service(2个实例)两个消费者消费消息,则对应的消息消费的结果可能是:24m28资讯网——每日最新资讯28at.com

// inventory-service// Exchange: {value="order-update", type="fanout"}// QueueBinding: {value=Queue('inventory-service'), bindingKey="order.*"}// inventory-service实例1消费到的消息OrderUpdateMessage(id="msg-0001", orderId = "order-0001", action="create", ...)OrderUpdateMessage(id="msg-0002", orderId = "order-0001", action="paid", ...)OrderUpdateMessage(id="msg-0006", orderId = "order-0002", action="paid", ...)// inventory-service实例2消费到的消息OrderUpdateMessage(id="msg-0003", orderId = "order-0001", action="modified", ...)OrderUpdateMessage(id="msg-0004", orderId = "order-0001", action="delivering", ...)OrderUpdateMessage(id="msg-0005", orderId = "order-0001", action="delivered", ...)// promotion-service// Exchange: {value="order-update", type="fanout"}// QueueBinding: {value="promotion-service", bindingKey="order.*.paid"}// promotion-service实例1消费到的消息OrderUpdateMessage(id="msg-0002", orderId = "order-0001", action="paid", ...)OrderUpdateMessage(id="msg-0006", orderId = "order-0002", action="paid", ...)

总结

RabbitMQ的Exchange支持不同类型(Direct, Fanout, Topic, Headers),以及Binding可以对消息以更灵活的通配符的方式将消息分发到对应的Queue上,因此其消息处理机制更加灵活。24m28资讯网——每日最新资讯28at.com

基于Topic的消息发布与消费模式,能够将消费者和生产者完全解耦,相对RabbitMQ中的所支持的灵活处理消息的方式,更加简单且易于理解,这也是Kafka的消息处理机制。24m28资讯网——每日最新资讯28at.com

通过对比不同的中间件的消息处理机制也许能找到更好的实践方式。24m28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-17548-0.html基于Topic的消息发布与消费模式

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 数据结构与集合的不解之缘,你了解多少?

下一篇: 解锁多核处理器的力量:探索数据并行化在 Java 8 Stream 中的应用

标签:
  • 热门焦点
  • K60 Pro官方停产 第三方瞬间涨价

    虽然没有官方宣布,但Redmi的一些高管也已经透露了,Redmi K60 Pro已经停产且不会补货,这一切都是为了即将到来的K60 Ultra铺路,属于厂家的正常操作。但有意思的是该机在停产之后
  • 石头自清洁扫拖机器人G10S评测:多年黑科技集大成之作 懒人终极福音

    科技圈经常能看到一个词叫“缝合怪”,用来形容那些把好多功能或者外观结合在一起的产品,通常这样的词是贬义词,但如果真的是产品缝合的好、缝合的实用的话,那它就成了中性词,今
  • 一篇聊聊Go错误封装机制

    %w 是用于错误包装(Error Wrapping)的格式化动词。它是用于 fmt.Errorf 和 fmt.Sprintf 函数中的一个特殊格式化动词,用于将一个错误(或其他可打印的值)包装在一个新的错误中。使
  • 如何通过Python线程池实现异步编程?

    线程池的概念和基本原理线程池是一种并发处理机制,它可以在程序启动时创建一组线程,并将它们置于等待任务的状态。当任务到达时,线程池中的某个线程会被唤醒并执行任务,执行完任
  • 一文掌握 Golang 模糊测试(Fuzz Testing)

    模糊测试(Fuzz Testing)模糊测试(Fuzz Testing)是通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。可以用来发现应用程序、操作系统和网络协议等中的漏洞或
  • 一文搞定Java NIO,以及各种奇葩流

    大家好,我是哪吒。很多朋友问我,如何才能学好IO流,对各种流的概念,云里雾里的,不求甚解。用到的时候,现百度,功能虽然实现了,但是为什么用这个?不知道。更别说效率问题了~下次再遇到,
  • 消费结构调整丨巨头低价博弈,拼多多还卷得动吗?

    来源:征探财经作者:陈香羽随着流量红利的退潮,电商的存量博弈越来越明显。曾经主攻中高端与品质的淘宝天猫、京东重拾“低价”口号。而过去与他们错位竞争的拼多多,靠
  • 联想小新Pad Pro 12.6将要推出,搭载高通骁龙 870 处理器

    联想小新Pad Pro 12.6将于秋季新品会上推出,官方按照惯例直接在发布会前给出了机型的所有参数。联想小新 Pad Pro 12.6 将搭载高通骁龙 870 处理器,重量为 5
  • 中关村论坛11月25日开幕,15位诺奖级大咖将发表演讲

    11月18日,记者从2022中关村论坛新闻发布会上获悉,中关村论坛将于11月25至30日在京举行。本届中关村论坛由科学技术部、国家发展改革委、工业和信息化部、国务
Top