消息队列逐渐成为分布式应用场景、内部通信、秒杀等高并发业务场景的核心手段。它具有低耦合、可靠传递、广播、流量控制、最终一致性等一系列功能。不管是RabbitMQ、RocketMQ、ActiveMQ、Kafka还是其他,都有一些基本原理、术语、机制等,总结分享一下。希望大家能尽快了解@mikechen1。使用消息队列技术时的消息生产者和消息传递者,QueueMessageProducerProducer:向消息队列发送消息。消息消费者Consumer:从消息队列中接收消息。Broker:概念来源于ApacheActiveMQ,指的是MQ的服务器,它帮你把消息从发送端传递到接收端。消息队列Queue:一个先进先出的消息存储区。消息按顺序发送和接收,一旦消息被消费和处理,消息将从队列中移除。2、Broker的设计主要考虑1)消息的转储:在更合适的时间点投递,或者通过一系列的手段辅助消息最终到达消费者机器。2)标准化一个范式和一个通用模式,以满足解耦、最终一致性和移峰的需求。3)其实简单理解就是消息转发器,将一个RPC变成两个RPC。发送方将消息传递给代理,代理将消息转发给接收端。总结起来就是2个RPC加1个dump,如果需要消费确认就是3个RPC。3.点对点消息队列模型点对点模型用于消息生产者和消息消费者之间的点对点通信。点对点模式包含三种角色:消息队列(Queue)发送者(Sender)接收者(Receiver)每条消息发送到特定的队列,接收者从队列中获取消息。队列在内存中或持久保存消息,直到它们被消耗或超时。特点每条消息只有一个消费者(Consumer)(即消息一旦被消费,则消息不再在消息队列中)发送方和接收方之间没有时间依赖性接收方成功接收后需要回复队列messageSuccess4.发布订阅消息模型Topic发布订阅模型包含三个角色:TopicPublisherSubscriber多个发布者向Topic发送消息,系统将这些消息传递给多个订阅者。特点每条消息可以有多个消费者:与点对点方式不同,发布的消息可以被所有订阅者消费发布者和订阅者之间存在时间依赖性。对于一个主题(Topic)的订阅者来说,它必须先创建一个订阅者,然后才能消费发布者的消息。为了使用消息,订阅者必须保持运行。5、点对点和发布订阅的区别生产者向队列队列发送消息,只有一个消费者可以接收到。发布者向主题发送的消息只会被订阅主题的订阅者接收。6、消息的顺序保证基于Queue消息模型,利用FIFO的先进先出特性可以保证消息的顺序。7.消息的ACK机制就是消息的Acknowledge确认机制。为了保证消息不丢失,消息队列提供了消息Acknowledge机制,即ACK机制。当消费者确认消息已被消费和处理时,向消息队列发送ACK。这时,消息队列就可以删除消息了。如果Consumer宕机/关闭,没有发送ACK,消息队列会认为该消息没有被处理,会重新发送消息给其他Consumers进行重新消费处理。8、最终一致性的设计思路,主要采用“记录”和“补偿”的方式。本地事务维护业务变更和通知消息,一起落地,然后RPC到达broker。broker登陆成功后,RPC返回成功,可以删除本地消息。否则,本地消息会一直采用定时任务轮询的方式重新发送,保证了消息可靠的落地到broker上。broker向消费者发送消息的过程类似,一直发送消息,直到消费者发送确认消费成功。让我们暂时忽略重复消息的问题。两个消息落地补偿后,下游肯定会收到消息。然后依靠状态机版本号等方法进行判断,更新自己的业务,达到最终一致性。如果消费者处理太慢,消费太慢,应让消费者主动认错,并可与经纪商约定下一次送货时间。对于broker传递给消费者的消息,需要记录下传递的IP地址,因为不确定是在业务处理过程中丢失,还是消息丢失时丢失。决定重发前先问问这个IP,消息处理成功了吗?如果查询失败,请重新发送。交易:本地交易,本地登陆,补偿发送。本地事务做的是业务落地和消息落地,而不是业务落地和RPC成功。只要消息落地成功,基本上就没有丢失的风险。9、消息的交易支持消息的接收和处理,支持交易。比如任务中心场景,一次处理可能涉及到多条消息的接收和处理,应该在同一个事务范围内。如果消息处理失败,事务返回Roll,消息回到队列中。10.消息的持久化消息的持久化对于一些关键的核心业务来说非常重要。开启消息持久化后,消息队列宕机重启后,消息可以从持久化存储中恢复,不会丢失。进行消费处理。11、消息队列的高可用在实际生产环境中,如果使用单实例的消息队列服务,如果出现宕机、重启等系统问题,消息队列将无法提供服务。因此,在很多场景下,我们希望消息队列有高可用的支持,比如RabbitMQ的镜像集群模式的高可用方案,ActiveMQ也有基于LevelDB+ZooKeeper的高可用方案,以及Kafka的Replication机制等12.消息队列选型及应用场景详见:高并发架构系列:分布式消息队列特点、选型、应用场景详解《BAT架构技术500期》系列文章作者,分享十余年架构经验和面试经验!更多技术文章集JavaConcurrency|JVM|MySQL|Spring|Redis|Distributed|HighConcurrency|架构师阅读mikechen的互联网架构关注“mikechen的互联网架构”公众号,回复【架构】领取本人原创《300 期 + BAT 架构技术系列与 1000 + 大厂面试题答案》
