找回密码
 立即注册
搜索
查看: 27|回复: 0

RabbitMQ

[复制链接]

8万

主题

-651

回帖

26万

积分

论坛元老

积分
261546
发表于 2025-11-1 14:19:14 | 显示全部楼层 |阅读模式

                    
                        

                    
                    

在互联网架构中,MQ是一种非常常见的上下游“逻辑解耦+物理解耦”的消息通信服务。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。



rabbitmq对java支持良好,对其他语言也支持良好,跨平台,语言无关activeMQ对java支持良好,缺点是对其他语言支持不够友好,适合中小企业系统kaffka日志消息中间件 支持大数据场景
4、不应使用MQ的场景:调用方实时依赖执行结果(上游需要关注执行结果)的业务场景,也就是上游实时关注执行结果



异步、解耦、流量削峰

是一个独立运行的服务。生产者发送消息,消费者接受消息,需要先跟服务器建立连接;采用消息队列作为数据结构,有先进先出的特点;具有发布订阅(publish/subscribe)的模型,消费者可以获取自己需要的消息。

运维成本高系统可用性降低系统复杂性提高

数据驱动的任务依赖上游不关心多下游执行结果异步返回执行时间长


AMQP(Advanced Message Queuing Protocol)



又称Broker,接收客户端连接,实现AMQP实体服务



连接,应用程序与Broker的网络连接



网络信道,几乎所有的操作都是在这上面进行,是消息读写的通道,客户端可以建立多个,每个代表一个会话。



消息,服务器与应用程序之间传送数据的载体,由Properties和Body组成。Properties可以对消息进行修饰,比如优先级、延迟等高级特性,Body是消息体内容。



虚拟主机,用于逻辑隔离,最上层的消息路由。可以有多个,一般由项目模块划分



交换机,接收消息,根据路由键转发消息到绑定的队列



Exchange与Queue之间的虚拟连接,binding中可以包含routing key



一个路由规则,虚拟机可以用它来确定如何路由一个特定的消息



Message Queue,消息队列,保存消息并将它们转发给消费者




MQ实现参照了jms规范,(规范就是一种约定)该规范中包括



提供者:实现jms规范的中间件服务器



客户端:发送或者接受消息的应用程序



生产者/发布者:创建并发送消息的客户端



消费者/订阅者:接受并处理消息的客户端



消息:应用程序之间传递的内容



消息模式:在客户端之间传递消息的方式,jms中定义了主题和队列两种模式



主题模式:假如发布者发布了100条消息,那么如果有n个订阅者,每个订阅者都可以获取到100条消息。


队列模式:假如生产者发送了100条消息,如果有n个消费者,那么每个消费者加起来获取到的消息总数是100,一个消息只能被一个消费者消费。




优点



解耦:上下游逻辑+物理解耦,除了与MQ有物理连接,模块之间都不相互依赖;将消息写入消息队列,新增一个下游消息关注方,上游不需要修改任何代码


异步:上游执行时间短,将消息写入消息队列,非必要的业务逻辑以异步的方式运行,加快响应速度


削峰:系统A慢慢的按照数据库能处理的并发量,从消息队列中慢慢拉取消息。在生产中,这个短暂的高峰期积压是允许的。




缺点



系统可用性降低:系统更复杂,多了一个MQ组件


消息传递路径更长,延时会增加


消息可靠性和重复性互为矛盾,消息不丢不重难以同时保证


上游无法知道下游的执行结果,这一点是很致命的




什么叫消息队列
消息(Message)是指在应用间传送的数据。消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象。 消息队列(Message Queue)是一种应用间的通信方式,消息发送后可以立即返回,由消息系统来确保消息的可靠传递。消息发布者只管把消息发布到 MQ 中而不用管谁来取,消息使用者只管从 MQ 中取消息而不管是谁发布的。这样发布者和使用者都不用知道对方的存在。



Connection是RabbitMQ的socket链接,它封装了socket协议相关部分逻辑ConnectionFactory为Connection的制造工厂Channel是我们与RabbitMQ打交道的最重要的一个接口,我们大部分的业务操作是在Channel这个接口中完成的,包括定义Queue、定义Exchange、绑定Queue与Exchange、发布消息等。Message acknowledgment:消息确认,消费者再消费完一条消息后会发送一个回执确认已经消费的信息到MQ,MQ则将该消息从队列中移除Message durability:消息持久化,到MQ服务宕机时保证未被消费的消息不丢失。Prefetch count:预取计数,消息一条一条推送,消费完一条再推送一条。Exchange:交换器,生产者将消息发送到Exchange(交换器,下图中的X),由Exchange将消息路由到一个或多个Queue中(或者丢弃)routing key:路由选择键,在发送消息给Exchange时,通过指定routing key来决定消息流向哪里,与Exchange Type及binding key联合使用才能最终生效Binding:RabbitMQ中通过Binding将Exchange与Queue关联起来,这样RabbitMQ就知道如何正确地将消息路由到指定的Queue了…


http://tryrabbitmq.com/  模拟画图工具



直连交换机,使用明确的绑定键,适用于业务明确的场景。一个队列与直连类型交换机绑定,需要指定一个明确的绑定键(binding key),生产者发送消息时会携带一个路由键(routing key)。当消息的路由键与某个队列的绑定键完全匹配时,消息才会从交换机路由到这个队列上,多个队列也可以使用相同的绑定键。消费者可以从队列中获取消息进行消费。

示例代码(原生)
pom

引入依赖



消费者


生产者


代码示例(死信队列)

实订单延时关闭,消息过期属性(x-message-ttl),通过设置这个属性,超过指定时间后,消息会被丢弃;通过

消费者


生产者


消费端限流

channel.basicQos(prefetchCount);






主题交换机,一个队列与主题类型交换机绑定时,可以在绑定键中使用通配符。支持两个通配符:



#代表0个或多个单词


*代表不多不少一个单词



单词指的是用英文的点“.”隔开的字符。例如 hello.tiger.yes 是3个单词


适用于一些根据业务主题或消息登记过滤的场景,比如或一条消息可能和资金有关,又和风控有关,那么就可以设置一个多级路由键。第一个单词和资金有关,第二个单词和风控有关。





广播交换机,队列与交换机不需要绑定键,因此生产者发送消息到交换机也不用携带路由键,当消息到达交换机时,所有与之绑定的队列都会收到相同的消息副本。






普通确认


批量确认


异步确认







               
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|usdt交易

GMT+8, 2025-11-29 20:01 , Processed in 0.119824 second(s), 20 queries .

Powered by usdt cosino! X3.5

© 2001-2025 Bitcoin Casino

快速回复 返回顶部 返回列表