消息中间件(1)MQ的详细解释和四个MQ的比较。

一、消息中间件的相关知识

1,概述

消息队列逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠交付、广播、流量控制和最终一致性等一系列功能,已经成为异步RPC的主要手段之一。现在市面上有很多主流的消息中间件,比如老牌的ActiveMQ,RabbitMQ,热门的Kafka,阿里巴巴自主研发的RocketMQ。

2.消息中间件的组成

2.1经纪人

消息服务器,作为服务器提供的消息的核心服务。

2.2生产商

消息生产者是业务的发起者,负责将生产消息传递给代理。

2.3消费者

消息消费者,即业务处理器,负责从代理获取消息并处理业务逻辑。

2.4主题

2.5队列

2.6信息

消息体是按照不同通信协议定义的固定格式编码的数据包,封装业务数据,实现消息传输。

3消息中间件模式分类

3.1点对点

PTP点对点:使用队列作为通信载体。

描述:

消息生产者产生消息并将其发送到队列,然后消息消费者将消息从队列中取出并使用它们。

消息被消费后,它不再存储在队列中,因此消息消费者不可能消费已被消费的消息。队列支持多个使用者的存在,但是只有一个使用者可以使用一条消息。

描述:

队列实现负载均衡,将生产者产生的消息发送到消息队列供多个消费者消费。但是一个信息只能被一个消费者接受。当没有可用的消费者时,消息将被保存,直到有可用的消费者为止。

消息中间件的4大优势

4.1系统解耦

交互系统之间没有直接的调用关系,只是通过消息传递,所以系统没有侵扰性,耦合度低。

4.2改善系统响应时间

比如在原来的一套逻辑中,支付的完成可能涉及修改订单状态、计算会员积分、通知物流配送等几个逻辑。通过MQ架构设计,可以将紧急、重要的服务(需要立即响应的服务)放入这种调用方法中,将响应要求不高的消息队列放入MQ队列中,供消费者处理。

4.3为大数据处理架构提供服务

通过消息集成,在大数据的背景下,消息队列也与实时处理架构相集成,为数据处理提供性能支持。

4.4 Java消息服务-JMS

Java消息服务(JMS)应用程序接口是Java平台上关于消息中间件(MOM)的API,用于在两个应用程序之间或分布式系统中发送消息以进行异步通信。

5个消息中间件应用场景

5.1异步通信

一些企业不想也不需要立即处理消息。消息队列提供了一种异步处理机制,允许用户将消息放入队列中,而无需立即处理它。将尽可能多的消息放入队列,然后在必要时处理它们。

5.2脱钩

降低项目间的强依赖性,适应异构系统。在项目初期,要预测项目未来会遇到什么需求是极其困难的。通过消息系统在处理流程中间插入一个隐式的基于数据的接口层,两个处理流程都要实现这个接口。当应用发生变化时,只要保证遵守相同的接口约束,两边的处理过程可以独立扩展或修改。

5.3冗余

在某些情况下,处理数据的过程会失败。除非数据被持久化,否则将会丢失。消息队列保存数据,直到数据被完全处理,从而避免了数据丢失的风险。在许多消息队列采用的“插入-获取-删除”范式中,在从队列中删除一条消息之前,您的处理系统需要明确指出该消息已经被处理,以确保您的数据被安全保存,直到您使用它。

5.4扩展性

因为消息队列分离了您的处理,所以只要您添加处理,就很容易增加消息入队和处理的频率。不需要修改代码和调整参数。便于分布式扩展。

5.5过载保护

在流量剧增的情况下,应用仍然需要继续发挥作用,但这种突发的流量是无法预测的;为了处理这种瞬间的峰值访问而随时将资源置于待命状态,无疑是一种巨大的浪费。使用消息队列可以使关键组件能够承受突然的访问压力,而不会由于突然的过载请求而完全崩溃。

5.6可恢复性

当系统的某些组件出现故障时,不会影响整个系统。消息队列减少了进程之间的耦合,因此即使处理消息的进程挂起,添加到队列中的消息仍然可以在系统恢复后得到处理。

5.7订单保证

在大多数使用场景中,数据处理的顺序非常重要。大多数消息队列最初是排序的,可以保证数据按照特定的顺序处理。

5.8缓冲

在任何重要的系统中,都会有需要不同处理时间的元素。消息队列通过缓冲层帮助最有效地执行任务,缓冲层有助于控制和优化系统中数据流的速度。以便调整系统响应时间。

5.9数据流处理

分布式系统产生的海量数据流,如业务日志、监控数据、用户行为等。,对这些数据流进行实时或批量的收集和汇总,然后进行大数据分析,是互联网必不可少的技术。通过消息队列收集此类数据是最佳选择。

消息中间件的6个通用协议

6.1 AMQP协议

AMQP是高级消息队列协议,是提供统一消息服务的应用程序级标准高级消息队列协议。它是应用层协议的开放标准,是为面向消息的中间件设计的。基于该协议的客户端和消息中间件可以传递消息,不受客户端/中间件不同产品和开发语言的限制。

优点:可靠,通用。

6.2 MQTT协议

MQTT(Message Queuing Telemetry Transport)是IBM开发的即时通讯协议,可能成为物联网的重要组成部分。该协议支持所有平台,几乎可以将所有联网对象与外部连接。它被用作传感器和执行器的通信协议(如通过Twitter联网房屋)。

优点:格式简单,占用带宽小,移动通信,推送,嵌入式系统。

6.3 STOMP协议

STOMP(面向流文本的消息协议)是一个面向流文本的消息协议,它是一个为MOM(面向消息的中间件)设计的简单文本协议。STOMP提供了一种可互操作的连接格式,允许客户端与任何STOMP消息代理进行交互。

优点:命令模式(不是主题\队列模式)

6.4 XMPP协议

XMPP(可扩展消息和存在协议)是基于可扩展标记语言(XML)的协议,主要用于即时消息(IM)和在线现场检测。适用于服务器之间的准即时操作。其核心是基于XML的流媒体,这可能最终允许互联网用户向互联网上的任何人发送即时消息,即使他们的操作系统和浏览器不同。

优点:普遍开放,兼容性强,可扩展性强,安全性高,但XML编码格式占用带宽大。

6.5其他基于TCP/IP的定制协议

一些特殊的框架(如redis、kafka、zeroMq等。)不根据自己的需求严格遵循MQ规范,而是封装一套基于TCP\IP的协议,通过网络socket接口传输,从而实现MQ功能。

7通用消息中间件MQ简介

7.1 RocketMQ

Ali是一个开源的消息中间件,采用分布式和队列模型,最初命名为Metaq,3.0版本名称改为Rocketmq,是Ali参考kafka设计思想用java实现的一套mq。同时整合了阿里内部多种mq产品(Notify、metaq),只维护核心功能,去除其他所有运行时依赖,保证最简单的核心功能。在此基础上,用阿里上面提到的其他开源产品实现了不同场景下的mq架构,目前主要用在订单交易系统中。

具有以下特点:

官方提供了一些与卡夫卡的对比差异:

https://rocketmq.apache.org/docs/motivation/

7.2兔子q

Erlang自己写的一个开源消息队列,支持很多协议:AMQP、XMPP、SMTP、STOMP,这使得它非常重量级,更适合企业级开发。同时实现了代理架构。核心思想是生产者不会直接向队列发送消息,消息在发送到客户端之前会在中央队列中排队。它对路由、负载平衡和数据持久性有很好的支持。它主要用于企业级ESB集成。

7.3 ActiveMQ

Apache下的子项目。利用Java全面支持JMS1.1和J2EE 1.4规范的JMS提供者实现,少量代码就能高效实现高级应用场景。可插拔传输协议支持,如:虚拟机内、TCP、SSL、NIO、UDP、组播、JGroups和JXTA传输。RabbitMQ、ZeroMQ、ActiveMQ都支持常用的多语言客户端,如C++、Java、.Net、Python、Php、Ruby等。

7.4 Redis

用C语言开发的键值NoSQL数据库在开发和维护方面非常活跃。虽然它是一个键值数据库存储系统,但是它支持MQ函数,所以它可以作为一个轻量级的队列服务。对于RabbitMQ和Redis的入队和出队操作,分别执行了654.38+0万次,每654.38+0万次记录一次执行时间。测试数据分为四种不同的大小:128字节、512字节、1K和10K。实验表明,当数据量较小时,Redis的性能高于RabbitMQ,但如果数据量超过10K,Redis就难以承受。出列时,无论数据大小如何,Redis都表现出非常好的性能,而RabbitMQ的出列性能远低于Redis。

7.5卡夫卡

scala实现的高性能分布式发布/订阅消息队列系统Apache下的一个子项目具有以下特点:

7.6零MQ

它被称为最快的消息队列系统,专门为高吞吐量/低延迟场景而开发,通常用于金融应用,重点是实时数据通信场景。ZMQ可以实现RabbitMQ不擅长的高级/复杂队列,但是需要开发者自己结合各种技术框架,导致开发成本很高。所以ZeroMQ有独特的非中间件模式,更像是一个套接字库。不需要安装运行消息服务器或者中间件,因为你的应用本身就是使用ZeroMQ API完成逻辑服务的角色。但是ZeroMQ只提供非持久队列,如果机器停机,数据就会丢失。比如Twitter Storm中使用ZeroMQ作为数据流的传输。

ZeroMQ套接字与传输层无关:ZeroMQ套接字为所有传输层协议定义了一个统一的API接口。默认情况下,支持进程内(inproc)、进程间(IPC)、多播和TCP协议,在不同协议之间切换只需更改连接字符串的前缀。它可以随时以最小的代价从进程间的本地通信切换到分布式TCP通信。ZeroMQ在后台处理连接建立、断开和重新连接的逻辑。

特点:

二、主要消息中间件的比较