音讯队列曾经逐步成为分布式应用场景、外部通信、以及秒杀等高并发业务场景的外围伎俩,它具备低耦合、牢靠投递、播送、流量管制、最终一致性 等一系列性能。

无论是 RabbitMQ、RocketMQ、ActiveMQ、Kafka还是其它等,都有的一些基本原理、术语、机制等,总结分享进去,心愿大家在应用音讯队列技术的时候可能疾速了解@mikechen

1. 音讯生产者、音讯者、队列

  •  音讯生产者Producer:发送音讯到音讯队列。
  •  音讯消费者Consumer:从音讯队列接管音讯。
  •  Broker:概念来自与Apache ActiveMQ,指MQ的服务端,帮你把音讯从发送端传送到接收端。
  •  音讯队列Queue:一个先进先出的音讯存储区域。音讯依照程序发送接管,一旦音讯被生产解决,该音讯将从队列中删除。

2.设计Broker次要思考

1)音讯的转储:在更适合的工夫点投递,或者通过一系列伎俩辅助音讯最终能送达消费机。

2)标准一种范式和通用的模式,以满足解耦、最终一致性、错峰等需要。

3)其实简略了解就是一个音讯转发器,把一次RPC做成两次RPC。发送者把音讯投递到broker,broker再将音讯转发一手到接收端。

总结起来就是两次RPC加一次转储,如果要做生产确认,则是三次RPC。

3. 点对点音讯队列模型

点对点模型 用于 音讯生产者 和 音讯消费者 之间 点到点 的通信。

点对点模式蕴含三个角色:

  •  音讯队列(Queue)
  •  发送者(Sender)
  •  接收者(Receiver)

每个音讯都被发送到一个特定的队列,接收者从队列中获取音讯。队列保留着音讯,能够放在 内存 中也能够 长久化,直到他们被生产或超时。

特点

  •  每个音讯只有一个消费者(Consumer)(即一旦被生产,音讯就不再在音讯队列中)
  •  发送者和接收者之间在工夫上没有依赖性
  •  接收者在胜利接管音讯之后需向队列应答胜利

4. 公布订阅音讯模型Topic

公布订阅模型蕴含三个角色:

  •  主题(Topic)
  •  发布者(Publisher)
  •  订阅者(Subscriber)

多个发布者将音讯发送到Topic,零碎将这些消息传递给多个订阅者。

特点

  •  每个音讯能够有多个消费者:和点对点形式不同,公布音讯能够被所有订阅者生产
  •  发布者和订阅者之间有工夫上的依赖性。
  •  针对某个主题(Topic)的订阅者,它必须创立一个订阅者之后,能力生产发布者的音讯。
  •  为了生产音讯,订阅者必须放弃运行的状态。

5.点对点和公布订阅的区别

生产者发送一条音讯到队列queue,只有一个消费者能收到。

发布者发送到topic的音讯,只有订阅了topic的订阅者才会收到音讯。

6. 音讯的程序性保障

基于Queue音讯模型,利用FIFO先进先出的个性,能够保障音讯的程序性。

7. 音讯的ACK机制

即音讯的Ackownledge确认机制,

为了保障音讯不失落,音讯队列提供了音讯Acknowledge机制,即ACK机制,当Consumer确认音讯曾经被生产解决,发送一个ACK给音讯队列,此时音讯队列便能够删除这个消

息了。如果Consumer宕机/敞开,没有发送ACK,音讯队列将认为这个音讯没有被解决,会将这个音讯从新发送给其余的Consumer从新生产解决。

8.最终一致性的设计思路

次要是用“记录”和“弥补”的形式。

本地事务保护业务变动和告诉音讯,一起落地,而后RPC达到broker,在broker胜利落地后,RPC返回胜利,本地音讯能够删除。否则本地音讯始终靠定时工作轮询一直重发,这样就保障了音讯牢靠落地broker。

broker往consumer发送音讯的过程相似,始终发送音讯,直到consumer发送生产胜利确认。

咱们先不理睬反复音讯的问题,通过两次音讯落地加弥补,上游是肯定能够收到音讯的。而后依赖状态机版本号等形式做判重,更新本人的业务,就实现了最终一致性。

如果呈现生产方解决过慢生产不过去,要容许生产方被动ack error,并能够与broker约定下次投递的工夫。

对于broker投递到consumer的音讯,因为不确定失落是在业务处理过程中还是音讯发送失落的状况下,有必要记录下投递的IP地址。决定重发之前询问这个IP,音讯解决胜利了吗?如果询问无果,再重发。

事务:本地事务,本地落地,弥补发送。本地事务做的,是业务落地和音讯落地的事务,而不是业务落地和RPC胜利的事务。音讯只有胜利落地,很大水平上就没有失落的危险。

9. 音讯的事务反对

音讯的收发解决反对事务,例如:在工作核心场景中,一次解决可能波及多个音讯的接管、解决,这应该处于同一个事务范畴内,如果一个音讯解决失败,事务回滚,音讯从新回到队列中。

10. 音讯的长久化

音讯的长久化,对于一些要害的外围业务来说是十分重要的,启用音讯长久化后,音讯队列宕机重启后,音讯能够从长久化存储复原,音讯不失落,能够持续生产解决。

11. 音讯队列的高可用性

在理论生产环境中,应用单个实例的音讯队列服务,如果遇到宕机、重启等零碎问题,音讯队列就无奈提供服务了,因而很多场景下,咱们心愿音讯队列有高可用性反对,例如

RabbitMQ的镜像集群模式的高可用性计划,ActiveMQ也有基于LevelDB+ZooKeeper的高可用性计划,以及Kafka的Replication机制等。

12.音讯队列的选型和利用场景

具体请参考:高并发架构系列:分布式之音讯队列的特点、选型、及利用场景详解

以上

作者简介

陈睿|mikechen,10年+大厂架构教训,《BAT架构技术500期》系列文章作者,分享十余年架构教训以及面试心得!

浏览mikechen的互联网架构更多技术文章合集

Java并发|JVM|MySQL|Spring|Redis|分布式|高并发|架构师

关注「mikechen 的互联网架构」公众号,回复 【架构】 支付我原创的《300 期 + BAT 架构技术系列与 1000 + 大厂面试题答案》