深入探讨消息中间件设计:涵盖整体架构与服务端重点
消息中间件身为系统间通信里的核心组件,它的设计直接关联到数据传递的可靠性,以及速度,还有整体架构的健壮性 。
消息流转的核心过程
一条消息,从产生开始,到被处理为止,一般会历经生产、传输以及消费这三个不同阶段。生产者借助一次远程调用,把消息发送给服务端,服务端接收之后,并不是马上就进行转发的,而是先进行暂存。这一次的暂存相当关键,它能够让消息被安全保留,即使接收方暂时处于不可达状态,等接收方恢复之时,再进行投递。当服务端给消费者推送那条消息的时候,第二次远程调用就发生了。要是消费者处理完毕以后,需要向服务端去进行确认,那就会触发第三次调用,直到这个时候,一个完整且可靠的单向流程才算圆满结束。
统一格式的消息协议
载体是消息本身,其结构规范要明确,发送方构造需按格式,接收方解析也要依此格式,这共同遵守的规范便是消息协议,早期有XMPP这类即时通讯标准,还有更通用的AMQP协议,如今不少追求极致性能的中间件,像RocketMQ和Kafka,它们都选自主定义二进制协议,目的是减少冗余开销,提升网络利用率,协议选择本质是在通用性与性能效率间权衡。
两种主流的通信模型
一种消息传递模式是点对点模式,在此模式里,消息会被送去特定队列,同一队列的消息仅能被一个消费者获取并加以处理,任务处理完便消失,常被用于负载均衡。另一种叫做发布订阅模式,此模式所不同的是,消息会被发布至主题,所有订阅过该主题的消费者都将会收到一份消息副本,生产者和消费者不需要相互感知,达成了系统间的解耦以及事件广播。
消息存储的介质选择
具有可靠存储特性的消息,是中间件的基石所在,平常所见到的介质,包含了内存、涉及数据整合层面的数据库以及文件系统。内存的运行速度是最快的,然而进程一旦重启,就会致使数据丢失,正因如此,它适用于日志收集这类允许数据出现丢失情况的场景。数据库能够提供具有强一致性的保障,实现的过程较为简单,所以适合应用于支付交易等对于可靠性有着极高要求的业务场景。针对海量数据堆积同时又允许出现少量数据丢失的场景而言,基于文件系统的存储方式,像是HBase或者Kafka这种特定自研的文件存储形式,在性能和容量之间达成了更为理想的平衡状态。
消费关系的维护机制
发布订阅模型里,服务端得知道每个主题对应的消费者是谁。这种消费订购关系并非是消息中间件核心直接打理的,借助类似ZooKeeper或者Etcd这样的外部协调服务。一旦有新消费者加入或者老消费者退出,协调服务会告知消息服务器,以便其动态调整分发路径,达成灵活广播还有扩缩容。
确保送达的进阶功能
对于成熟的消息中间件而言,除基础的收发功能外,还得支持高级特性,以此来保障业务的严谨程度。比如说事务消息,它被用来确保本地数据库操作以及消息发送具备原子性。另外还有消费重试机制,当消费者处理产生失败情况时,消息会被延迟后重新进行投递,从而防止因瞬时故障致使消息永远丢失。这些功能共同搭建起了高可用的异步通信基础设施 。
针对您的系统架构而言,消息中间件主要是被应用于哪一种业务场景情形,这般情况对于您挑选何种存储方案以及通信模型是否产生了决定性的影响作用呢,欢迎来到评论区分享您所拥有的实践经验,要是本文对您具备有帮助意义,请给予点赞进行支持。


