消息中间件的实现方案

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
简介:

消息中间件对目前大中型互联网来说是非常重要的,在业务数据流动中仅次于RPC服务调用,担负着越来越复杂的网站业务从主流程上解耦的重要责任;

    从目前互联网对消息中间件的需求来看应该分为两种类型,一种是和钱相关的需求,一种是和钱无关的需求;和钱相关的需求消息的可靠性是放在第一位的,和钱无关的需求是速度放在第一位的,但这两种需求又是矛盾的,很难设计出一种既可靠又高效的系统,除非将两套方案捏合成一个系统,通过配置来选择不同方案,但从实现上说还是两种实现。所以目前业界有几种不同的设计方式来满足不同的需求。

下面看看以下几种典型实现方案:

1、以ActiveMQ为代表的可靠性优先的设计原理:

    此种方案将所有的消息数据和消息的发送状态都存储在消息服务器上,可以在消息服务上通过多种手段来保证消息的可靠性,但增加了众多复杂的可靠性保证手段后,消息从发布者到订阅者的速度势必会受到影响;此种方式发布者将消息推向消息服务器,消息服务器再将消息推向订阅者,为消息发送策略提供了很好的可扩展性;

2、以KafKa为代表的速度优先的设计原理:



    此种方式将消息的发送状态保存在客户端,同时客户端用拉的模式从消息服务器上获取消息,由于是顺序读,同时还采取了很多保证速度的策略,如zero-copy,所以此种方案速度比较快,但牺牲了很多可靠性方面的保证,比较适合Web2.0网站,这些网站对消息的可靠性要求不是很高,同时由于产生了大量的和用户状态相关的消息,需要一个高效的系统来处理这些消息;另外这种方案也比较适合日志消息的收集;


3、传统的系解耦方案:



    此种方式是不用消息中间件直接用数据库存储做的解耦,随着消息中间件的出现,这种方式的使用越来越少,但现在由于MongoDB和Redis等的兴起,一些基于这些Nosql数据库的消息应用逐渐兴起,由于消息数据和消息状态都存储在DB上,所以效率和速度在上面两种方案之间;

 

    那么有没有一种更高效的方式呢?

 

    答案是肯定的,但那可能要进一步降低可靠性!

 

    看看Facebook的Scribe日志收集系统的原理:

 

 

    如果Scribe Server正常工作,Scribe Client将App的日志(可以看成一个消息)推送到Scribe Server端,如果不正常,则写到本地文件,当Scribe Server恢复正常时再将其推送过去;这里使用本地文件作为缓冲,那么能否综合Scribe和Kafka的优点来设计一个消息系统(或日志收集系统,改造一下可以互用),看下面的方案:

    上面的MQ暂且叫他FastMQ吧,中消息发布端直接写本地文件,同时消息订阅者通过Zookeeper协调,向相关消息发布者的Agent拉消息,并在本地记录消息指针状态;

    如果嫌在消息发布端开启MQ Agent麻烦,那么如中消息拉取协议使用SCP或FTP协议,用这些Linux必备的协议提供者作为Agent减少开发和部署的难度,在服务订阅端解析这些协议流,反序列化为消息供业务使用;

    如果觉得消息只存储在消息发布端的磁盘不可靠,那么如中可以在消息订阅者处理不及消息的时候,把消息数据缓冲在消息订阅端的磁盘上来备份数据,不过这样做就使系统变的复杂,虽然提高了可靠性,但是速度就会有所降低;

 

    此种方案可以使消息分散的存储在业务本身的磁盘上,避免集中存储相互影响的缺点,同时又可以有效利用业务机器的磁盘(大部分业务机器磁盘基本没使用),另外还可以减少一次网络通信的过程,使从发送到接收的速度更快;但其本身也有不少缺点,要做好监控,避免消息大量积压的时候业务磁盘过度使用,对业务造成影响。

 

     目前我们的监控日志收集系统使用的是和中类似的方案,消息系统使用的是3方案,后期可能会将可靠性要求高的向1方案过度,可靠性要求不高的向最下面介绍这种过度!

 

转自:http://www.iteye.com/topic/1113331

分类: 软件设计
 
 
 
本文转自左正博客园博客,原文链接: http://www.cnblogs.com/soundcode/p/7149839.html,如需转载请自行联系原作者
相关实践学习
消息队列+Serverless+Tablestore:实现高弹性的电商订单系统
基于消息队列以及函数计算,快速部署一个高弹性的商品订单系统,能够应对抢购场景下的高并发情况。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
3月前
|
消息中间件 存储 缓存
架构设计篇问题之消息队列(MQ)在微服务系统中问题如何解决
架构设计篇问题之消息队列(MQ)在微服务系统中问题如何解决
|
5月前
|
消息中间件 NoSQL Kafka
【消息队列】如何做技术选型?
【消息队列】如何做技术选型?
85 1
|
5月前
|
消息中间件 Java API
【微服务系列笔记】MQ消息可靠性
消息可靠性涉及防止丢失,包括生产者发送时丢失、未到达队列以及消费者消费失败处理后丢失。 确保RabbitMQ消息可靠性的方法有:开启生产者确认机制,确保消息到达队列;启用消息持久化以防止未消费时丢失;使用消费者确认机制,如设置为auto,由Spring确认处理成功后ack。此外,可开启消费者失败重试机制,多次失败后将消息投递到异常交换机。
87 1
|
消息中间件 存储 运维
消息队列与消息中间件概述:消息中间件核心概念与技术选型
消息队列是一个存放消息的容器,消息队列是分布式系统中重要的组件,使用消息队列主要是为了通过异步处理提高系统性能、削峰、降低系统耦合性。
557 6
|
消息中间件 存储 Cloud Native
技术盘点:消息中间件的过去、现在和未来
目前以“事件驱动”构建的数字化商业生态才刚起步,未来 EventBridge 将围绕事件这一抽象层次实现更强大的能力,比如事件的全链路可观测、事件分析计算、低代码开发等特性,帮助企业全面落地云时代的“事件驱动”架构。
268 5
技术盘点:消息中间件的过去、现在和未来
|
消息中间件 存储 运维
MQ系列2:消息中间件的技术选型
MQ系列2:消息中间件的技术选型
237 2
MQ系列2:消息中间件的技术选型
|
消息中间件 存储 NoSQL
分布式服务下,消息中间件改造
在系统开发初期,很容易出现这样一种情况:不同业务线上开发人员,因为技术栈和版本时间的影响,在选型的时候会优先使用自己熟悉的,例如MQ中间件常用的:Kafka、Rocket、Rabbit等,这样很容易忽略各个项目之间的组件差异问题;
119 3
分布式服务下,消息中间件改造
|
消息中间件 存储 Java
消息队列:从选型到原理,一文带你全部掌握(二)
消息队列中间件重要吗?面试必问问题之一,你说重不重要。我有时会问同事,为啥你用RabbitMQ,不用Kafka,或者RocketMQ呢,他给我的回答“因为公司用的就是这个,大家都这么用”,如果你去面试,直接就被Pass,今天这篇文章,告诉你如何回答。 这篇文章纯理论,主要整理网络资料,肝了我整整一个月!文章依然延续上几篇的风格,很长,长到我只整理排版,手都整麻了。全文2.5万字,建议先收藏,后续面试、或者技术选型,再拿出来喵喵,不BB,上思维导图!
485 0
消息队列:从选型到原理,一文带你全部掌握(二)
|
消息中间件 存储 Java
消息队列:从选型到原理,一文带你全部掌握(一)
消息队列中间件重要吗?面试必问问题之一,你说重不重要。我有时会问同事,为啥你用RabbitMQ,不用Kafka,或者RocketMQ呢,他给我的回答“因为公司用的就是这个,大家都这么用”,如果你去面试,直接就被Pass,今天这篇文章,告诉你如何回答。 这篇文章纯理论,主要整理网络资料,肝了我整整一个月!文章依然延续上几篇的风格,很长,长到我只整理排版,手都整麻了。全文2.5万字,建议先收藏,后续面试、或者技术选型,再拿出来喵喵,不BB,上思维导图!
534 0
消息队列:从选型到原理,一文带你全部掌握(一)
|
消息中间件 存储 负载均衡
消息队列:从选型到原理,一文带你全部掌握(三)
消息队列中间件重要吗?面试必问问题之一,你说重不重要。我有时会问同事,为啥你用RabbitMQ,不用Kafka,或者RocketMQ呢,他给我的回答“因为公司用的就是这个,大家都这么用”,如果你去面试,直接就被Pass,今天这篇文章,告诉你如何回答。 这篇文章纯理论,主要整理网络资料,肝了我整整一个月!文章依然延续上几篇的风格,很长,长到我只整理排版,手都整麻了。全文2.5万字,建议先收藏,后续面试、或者技术选型,再拿出来喵喵,不BB,上思维导图!
215 0
消息队列:从选型到原理,一文带你全部掌握(三)