消息队列的一些思考

最近工作中,涉及到的一些解决方案,发现引入消息队列会更好更优雅地解决问题。

业务场景:用户新装修的店铺发布后,需要相关系统做一些对应的工作:缓存系统做数据清理,通知依赖的第三方系统...

当前解决方案:店铺发布系统异步编码实现相关逻辑;

现实问题:1、采用第三方系统提供接口供店铺系统发送通知:店铺系统需要处理通知发送成功、失败、无响应等逻辑,需要考虑通知是否一定要发送成功才能进行下一步;2、不通知,直接将第三方系统的逻辑直接编码但了店铺店铺系统:代码侵入,此段逻辑缺乏上下文,很难维护;3、每增加一个对店铺发布事件有兴趣的业务方,系统都需要增加编码逻辑,店铺系统被第三方系统侵入(非常大的问题);4、基于以上问题,很对第三方都是采用定时更新的方案,容忍一定时间段内的不一致;

新方案:引入消息队列,店铺发布后生成店铺发布事件;相关方订阅店铺发布事件主题,实现自己相关业务逻辑;

优势:1、店铺系统只和消息队列交互,简化了店铺系统的相关编码逻辑,能更快地返回;2、第三方系统的代码放到了第三方系统内部;3、新增加业务方,只需业务方订阅,编写相关逻辑即可,实现了系统解耦(非常重要的改进);4、系统不一致的时间大大缩短;

消息中间件的一些思考:

好处:系统解耦;异步,并发,加速业务流程处理;通过消息系统的高可靠性,在不增加系统编码复杂行的前提下保证消息的高可靠性:如果两个系统直接交互,发送方需要编码处理发送成功、失败、无响应等等各种情况,有消息中间件的情况下,发送方在消息发送中间件成功的情况下,消息的可达性由中间件保证;

需要解决的问题:可靠性,消息堆积不丢失,单队列风险;消息延时问题;消息重复、乱序问题;消息送达consumer方式;消息队列和producer、consumer集群发生了关联,不能对彼此      的集群扩容造成影响;系统集群内的应用都订阅事件,导致系统重复收到消息;消息如何送达consumer;

可靠性:consumer消费能力不足、宕机等情况导致消息堆积,raid磁盘整列保证单磁盘的数据安全性,冗余磁盘避免单点风险;冗余队列、异步复制避免单队列风险;集群避免单机风险;

消息延时:很多场景下,这都不是问题;如果是,那么考虑是否能在接受最终一致性的前提下,容忍一定时间段内中间状态的不一致;是否可以重新设计;

消息重复:消息发送失败或无响应,一般都会重发,从而导致重复。1、消费者幂等,此时基本不需要解决重复问题;2、消息添加全局唯一id,消费者自己去重,会增加业务流程响应时间;

消息乱序:有序消息好处:逻辑简单;问题:维护有序性是付出代价的,最简单的情况下,只能由单一的producer在发送成功消息1时再发送消息2,消息队列只能往同一个consumer按序发送消息1、消息2,极大限制了系统负载能力,即使参考tcp后的优化方案:单一producer并行发送带排序号的消息1、消息2,单一consumer方组合,仍然受单机限制;再分别通过producer和consumer内容的集中式存储,优化为多producer、多consumer,编码难度和负载能力仍然不是最理想。说了这么多,其实就是想把有序的方案,在保证最终一致性的前提下变为无序。现实中,至少80%以上是无序的。

扩容:消息队列可对集群提供分类管理,为不同的consumer、producer集群提供groupId;

集群重复收取消息:每个集群分配一个groupId,每条消息只往一个groupId发送一次;

消息送达consumer:主动推送,低延迟;consumer主动拉取,频度很难控制,太频繁浪费消息系统资源,偶尔又有高延时;consumer发起询问,如果有,发送,双倍交互次数;

时间: 2024-10-01 03:15:03

消息队列的一些思考的相关文章

消息队列设计精要【转】

消息队列已经逐渐成为企业IT系统内部通信的核心手段.它具有低耦合.可靠投递.广播.流量控制.最终一致性等一系列功能,成为异步RPC的主要手段之一. 当今市面上有很多主流的消息中间件,如老牌的ActiveMQ.RabbitMQ,炙手可热的Kafka,阿里巴巴自主开发的Notify.MetaQ.RocketMQ等. 本文不会一一介绍这些消息队列的所有特性,而是探讨一下自主开发设计一个消息队列时,你需要思考和设计的重要方面.过程中我们会参考这些成熟消息队列的很多重要思想. 本文首先会阐述什么时候你需要

消息队列设计精要(转)

消息队列已经逐渐成为企业IT系统内部通信的核心手段.它具有低耦合.可靠投递.广播.流量控制.最终一致性等一系列功能,成为异步RPC的主要手段之一.当今市面上有很多主流的消息中间件,如老牌的ActiveMQ.RabbitMQ,炙手可热的Kafka,阿里巴巴自主开发的Notify.MetaQ.RocketMQ等.本文不会一一介绍这些消息队列的所有特性,而是探讨一下自主开发设计一个消息队列时,你需要思考和设计的重要方面.过程中我们会参考这些成熟消息队列的很多重要思想.本文首先会阐述什么时候你需要一个消

Python 番外 消息队列设计精要

消息队列已经逐渐成为企业IT系统内部通信的核心手段.它具有低耦合.可靠投递.广播.流量控制.最终一致性等一系列功能,成为异步RPC的主要手段之一.当今市面上有很多主流的消息中间件,如老牌的ActiveMQ.RabbitMQ,炙手可热的Kafka,阿里巴巴自主开发的Notify.MetaQ.RocketMQ等.本文不会一一介绍这些消息队列的所有特性,而是探讨一下自主开发设计一个消息队列时,你需要思考和设计的重要方面.过程中我们会参考这些成熟消息队列的很多重要思想.本文首先会阐述什么时候你需要一个消

消息队列设计精要(转载)

消息队列已经逐渐成为企业IT系统内部通信的核心手段.它具有低耦合.可靠投递.广播.流量控制.最终一致性等一系列功能,成为异步RPC的主要手段之一.当今市面上有很多主流的消息中间件,如老牌的ActiveMQ.RabbitMQ,炙手可热的Kafka,阿里巴巴自主开发的Notify.MetaQ.RocketMQ等.本文不会一一介绍这些消息队列的所有特性,而是探讨一下自主开发设计一个消息队列时,你需要思考和设计的重要方面.过程中我们会参考这些成熟消息队列的很多重要思想.本文首先会阐述什么时候你需要一个消

【转】消息队列设计精要

介绍的比较全面,可以借鉴学习:原文连接:http://tech.meituan.com/mq-design.html 消息队列已经逐渐成为企业IT系统内部通信的核心手段.它具有低耦合.可靠投递.广播.流量控制.最终一致性等一系列功能,成为异步RPC的主要手段之一.当今市面上有很多主流的消息中间件,如老牌的ActiveMQ.RabbitMQ,炙手可热的Kafka,阿里巴巴自主开发的Notify.MetaQ.RocketMQ等.本文不会一一介绍这些消息队列的所有特性,而是探讨一下自主开发设计一个消息

搞懂分布式技术20:消息队列因何而生

搞懂分布式技术20:消息队列因何而生 消息队列已经逐渐成为企业IT系统内部通信的核心手段.它具有低耦合.可靠投递.广播.流量控制.最终一致性等一系列功能,成为异步RPC的主要手段之一. 当今市面上有很多主流的消息中间件,如老牌的ActiveMQ.RabbitMQ,炙手可热的Kafka,阿里巴巴自主开发的Notify.MetaQ.RocketMQ等. 本文不会一一介绍这些消息队列的所有特性,而是探讨一下自主开发设计一个消息队列时,你需要思考和设计的重要方面.过程中我们会参考这些成熟消息队列的很多重

C#分布式消息队列 EQueue 2.0 发布啦

前言 最近花了我几个月的业余时间,对EQueue做了一个重大的改造,消息持久化采用本地写文件的方式.到现在为止,总算完成了,所以第一时间写文章分享给大家这段时间我所积累的一些成果. EQueue开源地址:https://github.com/tangxuehua/equeue EQueue相关文档:http://www.cnblogs.com/netfocus/category/598000.html EQueue Nuget地址:http://www.nuget.org/packages/eq

对分布式事务、消息队列的重新认识

本质上问题可以抽象为:当一个表数据更新后,怎么保证另一个表的数据也必须要更新成功.若两张表在同一个数据库实例中,则使用本地事务就好了.否则可以采用分布式事务,或者消息队列. 前阵子从支付宝转账1万块钱到余额宝,这是日常生活的一件普通小事,但作为互联网研发人员的职业病,我就思考支付宝扣除1万之后,如果系统挂掉怎么办,这时余额宝账户并没有增加1万,数据就会出现不一致状况了. 上述场景在各个类型的系统中都能找到相似影子,比如在电商系统中,当有用户下单后,除了在订单表插入一条记录外,对应商品表的这个商品

消息总线VS消息队列

前段时间实现了一个基于RabbitMQ的消息总线,实现的过程中自己也在不断得思考.总结以及修正.需要考虑各个维度:效率.性能.网络.吞吐量.甚至需要自己去设想API可能的使用场景.模式.不过能有一件事情,自己愿意去做,在走路.吃饭.坐公交的时候都在思考如何去改进它,然后在实践的过程中,促使去思考并挖掘自己知识面的空白,也是一件让人开心的事情. 借此记录下自己在实现的过程中,以及平时的一些想法. 这是第一篇,先谈谈消息总线跟消息队列的区别,以及对于企业级应用需要将消息队列封装成消息总线的必要性.