声明:原文出处已在文末标出,本人出于学习,对其做了整理,收集干货,不作商业用途!
目录
8.2 如何保证消息不被重复消费(如何保证消息队列的幂等性)
正文
一、消息中间件的简介
消息中间件(MOM),用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。本文主要讲消息队列,消息队列(Message queue 即MQ)是在消息的传输过程中保存消息的容器。MQ负责两个系统之间传递消息,这两个系统可以是异构的,处于不同硬件、不同操作系统、用不同语言编写,只需要简单配置、以及简单的调用几个MQ的API,就可以互相通讯,你不必考虑底层系统和网络的复杂性,MQ能够应付多种异常情况,例如网络阻塞、临时中断等等;消息队列主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构。使用较多的消息队列有ActiveMQ,RocketMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ等,部分 数据库 如 Redis
、MySQL
以及 phxsql
也可实现消息队列的功能。
二、消息中间件(MQ)的使用场景(为什么要使用MQ)
消息中间件的使用场景主要的有以下几点:解耦、异步、削峰、日志、消息通讯,下面逐个解释:
2.1 解耦
传统模式:
传统模式的缺点:系统间耦合性太强,如上图所示,系统A在代码中直接调用系统B和系统C的代码,如果将来D系统接入,系统 A还需要修改代码,过于麻烦!
中间件模式::
中间件的优点:将消息写入消息队列,需要消息的系统自己从消息队列中订阅,从而系统A不需要做任何修改。
2.2 异步
传统模式:
传统模式的缺点:一些非必要的业务逻辑以同步的方式运行,太耗费时间。
中间件模式:
中间件模式优点: 将消息写入消息队列,非必要的业务逻辑以异步的方式运行,加快响应速度。
2.3 削峰
传统模式:
传统模式的缺点:并发量大的时候,所有的请求直接怼到数据库,造成数据库连接异常。
中间件模式:
中间件模式的优点:系统A慢慢的按照数据库能处理的并发量,从消息队列中慢慢拉取消息。在生产中,这个短暂的高峰期积压 是允许的,假如消息队列的长度超过最大数量,则直接抛弃用户请求或跳转到错误页面。
流量削峰的典型应用:淘宝的双11秒杀,团购抢购活动,一般因为流量过大,导致流量暴增,应用挂掉。为解决此问题, 一般 需要在应用前端加入消息队列,一者可以控制活动的人数,二来也可以缓解短时间内高流量压垮应用。
2.4 日志处理
日志处理是指将消息队列用在日志处理中,比如Kafka的应用。架构简化如下
日志采集:负责日志数据采集,定时写受写入Kafka队列;
Kafka消息队列:负责日志数据的接收,存储和转发;
日志处理应用:订阅并消费kafka队列中的日志数据 。
应用:解决大量日志传输的问题。
2.5 消息通讯
消息通讯是指,消息队列一般都内置了高效的通信机制,因此也可以用在纯的消息通讯。比如实现点对点消息队列,或者聊天室等。
2.5.1 点对点通讯
客户端A和客户端B使用同一队列,进行消息通讯。
2.5.2 发布/订阅通讯
客户端A,客户端B,客户端C,客户端D 订阅同一主题(topic),进行消息发布和接收。实现类似聊天室效果。
消息通讯的典型应用:今日头条的私信功能,因为消息通信的数据不需要即时立即同步回来,不算核心数据,这样可以降低系统 的负荷。
三、消息中间件常用协议
3.1 AMQP协议
AMQP即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同开发语言等条件的限制。
优点:可靠、通用
3.2 MQTT协议
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和致动器(比如通过Twitter让房屋联网)的通信协议。
优点:格式简洁、占用带宽小、移动端通信、PUSH、嵌入式系统
3.3 STOMP协议
STOMP(Streaming Text Orientated Message Protocol)是流文本定向消息协议,是一种为MOM(Message Oriented Middleware,面向消息的中间件)设计的简单文本协议。STOMP提供一个可互操作的连接格式,允许客户端与任意STOMP消息代理(Broker)进行交互。本博客之前写了个小例子,可参考 Spring boot+Maven+Websocket的升级版之stomp的小栗子(此为广播版,即一人发消息多人接收,点对点版本马上更新)_zxl技术博客的博客-优快云博客
优点:命令模式(非topic\queue模式)
3.4 XMPP协议
XMPP(可扩展消息处理现场协议,Extensible Messaging and Presence Protocol)是基于可扩展标记语言(XML)的协议,多用于即时消息(IM)以及在线现场探测。适用于服务器之间的准即时操作。核心是基于XML流传输,这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息,即使其操作系统和浏览器不同。
优点:通用公开、兼容性强、可扩展、安全性高,但XML编码格式占用带宽大
3.5 其他基于TCP/IP自定义的协议
有些特殊框架(如:redis、kafka、zeroMq等)根据自身需要未严格遵循MQ规范,而是基于TCP\IP自行封装了一套协议,通过网络socket接口进行传输,实现了MQ的功能。
四、消息中间件订阅模式
4.1 点对点模式
过程:消息生产者(Product)生产消息发送到消息对列(Queue)中,然后消息消费者(Consumer)从que