当前位置: 首页 > 科技观察

从0到1设计一个MQ消息队列

时间:2023-03-13 19:06:58 科技观察

消息队列作为系统解耦和流量控制的工具,是分布式系统的核心组件之一。了解消息队列背后的实现非常重要。今天,让我们讨论一下设计消息队列背后的技术。消息队列的整体设计思路主要是设计一个整体的消息消费数据流。这会涉及到:消息生产Producer、Broker(消息服务器)、消息消费者Consumer。1.Producer(消息生产者):向Broker发送消息。2、Broker(服务器):Broker的概念主要来源于Apache的ActiveMQ,具体指的是消息队列的服务器。主要功能是:将消息从发送者传递给接收者,这会涉及到消息的存储、消息通信机制等。3.Consumer(消息消费者):从消息队列中接收消息,消费者回复消费确认。Broker(消息队列服务器)设计重点1)消息转储:在更合适的时间点投递,或者通过一系列手段协助消息到达消费者机器。2)标准化一个范式和一个通用模式,以满足解耦、最终一致性和移峰的需求。3)其实简单理解就是消息转发器,将一个RPC转成两个RPC。发送方将消息传递给代理,代理将消息转发给接收端。总结起来就是2个RPC加1个dump,如果需要消费确认就是3个RPC。为了实现上述消息队列的基本功能:1)消息传输2)存储3)消费,需要进行以下三个方面的设计:1)通信协议2)存储选择3)消费关系维护通信protocolmessageMessage:既是信息的载体,消息发送者需要知道如何构造消息,消息接收者需要知道如何解析消息,他们需要用统一的格式来描述消息,称为消息协议。传统的通信协议标准包括XMPP和AMQP协议等,现在更多的消息队列从性能的角度出发,使用自己设计实现的通信协议。1、JMSJMS(JavaMessageService)其实指的是JMSAPI。JMS是Sun公司早期提出的消息标准,旨在为java应用程序提供统一的消息操作,包括创建消息、发送消息、接收消息等。JMS通常包括以下角色:JMS提供两种消息模型:1)点对点2)发布-订阅(publish-subscribe)模型。使用点对点模型时,消息被发送到一个队列,该队列的消息只能由一个消费者使用。使用发布-订阅模型,消息可以被多个消费者消费。在发布-订阅模型中,生产者和消费者是完全独立的,不需要知道对方的存在。2.AMQPAMQP是AdvancedMessageQueuingProtocol,即高级消息队列协议。AMQP并不是一个具体的消息队列实现,而是一个标准化的消息中间件协议。目标是让不同语言和系统的应用程序能够相互通信,并提供简单统一的模型和编程接口。目前主流的ActiveMQ和RabbitMQ都支持AMQP协议。AMQP是一种协议,更准确地说是一种二进制线级协议(链接协议)。这是它和JMS的本质区别。AMQP不从API层限制,而是直接定义了网络交换的数据格式。JMS与AMQP的比较JMS:只允许基于JAVA的消息平台之间通信AMQP:AMQP允许多种技术同时通信3.Kafka的通信协议Kafka的Producer、Broker和Consumer使用了一套自己设计的基于TCP层的协议。Kafka的协议是完全根据Kafka自身的业务需求定制的。存储选择对于分布式系统,存储选择包括以下几种:1.内存2.本地文件系统3.分布式文件系统4.Nosql5.DB从速度上来说内存显然是最快的。对于允许消息丢失、消息对积累能力要求不高的场景(比如日志),内存会是更好的选择。DB是实现可靠存储最简单的解决方案。非常适合可靠性要求高、最终一致性高的场景(比如事务消息)。对于不需要100%保证数据完整性的场景,需要性能和消息积累。对于场景来说,hbase也是一个不错的选择。理论上,从速度上看,文件系统>分布式KV(持久化)>分布式文件系统>数据库,但可靠性恰恰相反。还是需要根据支持的业务场景做出最合理的选择。如果你的消息队列是用来支持支付/交易的,可靠性要求很高,但是对性能和体积的要求不是那么高,也没有时间和精力专门去研究文件存储系统,DB是最好的选择。对于不需要100%保证数据完整性,对性能和消息积累有要求的场景,hbase也是一个不错的选择。典型的消息如Kafka可以使用Hadoop。消费者关系处理现在我们的消息队列初步具备了转储消息的能力。下一个重要的事情是分析发送和接收关系并进行正确的消息传递。市面上的消息队列定义了一堆让人眼花缭乱的名词,比如JMS规范中的Topic/Queue,Kafka中的Topic/Partition/ConsumerGroup,RabbitMQ中的Exchange等等。抛开现象看本质,无非是单播和广播的区别。所谓单播,就是点对点;广播是一对多的。为了实现广播功能,我们必须维护消费关系。通常,消息队列本身并不维护消费订阅关系。可以使用zookeeper等成熟的系统来维护消费关系,并在消费关系发生变化时发送通知。消息队列需要支持高级特性,消息顺序投递,可??靠性,消息持久化,支持不同的消息模型,多实例集群功能,事务特性等。除了上述消息队列的基本功能,消息队列还需要支持一些特殊场景下的事务。重试等功能。以上就是从0到1设计一个MQ消息队列的经验分享。