如何选择消息中间件

news2024/12/26 9:33:19

d5179dfa03bc428f832fde4b84ddd3a6.jpg一、 分布式系统消息通信技术简介

 

分布式系统消息通信技术主要包括以下几种:

 

1. RPC(Remote Procedure Call Protocol).

一般是C/S方式,同步的,跨语言跨平台,面向过程

 

2. CORBA(Common Object Request Broker Architecture).

CORBA从概念上扩展了RPC。面向对象的,企业级的(面向对象中间件还有DCOM)

 

3. RMI(Remote Method Invocation).

面向对象方式的 Java RPC

 

4. WebService.

基于Web,C/S或B/S,跨系统跨平台跨网络。多为同步调用, 实时性要求较高

 

5. MOM(Message oriented Middleware).

面向消息中间件,主要适用于消息通道、消息总线、消息路由和发布/订阅的场景。目前主流标准有JMS(Java Message Service)、AMQP(Advanced Message Queuing Protocol)和STOMP(Streaming Text Oriented Messaging Protocol)。

 

JMS是Java平台上的面向接口的消息规范,是一套API标准,并没有考虑异构系统。AMQP是一个面向协议的,跟语言平台无关的消息传递应用层协议规范。STOMP是流文本定向消息协议,是一种为MOM设计的简单文本协议。AMQP和STOMP都是跟http处于同一层的协议。

 

在 AMQP 模型中,消息的 producer 将 Message 发送给 Exchange,Exchange 负责交换 / 路由,将消息正确地转发给相应的 Queue。消息的 Consumer 从 Queue 中读取消息。

 

AMQP 系统构架

 

 

 

 

 

二、 常见开源跨平台MQ简介

目前业界上关于消息中间件的实现多达好几十种,可谓百花齐放,所用的实现语言同样也五花八门。下面挑选了一部分,在网上开源社区相对容易搜索出来的十多种MQ来作简单介绍。

 

开源MQ

 

概述

 

1.Qpid

 

Apach的一个开源AMQP实现,broker架构,有C++和Java两个版本

 

2.RabbitMQ

 

LShift 用Erlang实现,支持多协议,broker架构,重量级

 

3.ZeroMQ

 

AMQP最初设计者iMatix公司实现,轻量消息内核,无broker设计。C++实现

 

4.Jafka/Kafka

 

LinkedIn用Scala语言实现,支持hadoop数据并行加载

 

5.ActiveMQ

 

Apach的一种JMS具体实现,支持代理和p2p部署。支持多协议。Java实现

 

6.Apollo

 

ActiveMQ的下一代产品,支持多协议,Scala实现

 

7.Redis

 

Key-value NoSQL数据库,有MQ的功能

 

8.MemcacheQ

 

国人利用memcache缓冲队列协议开发的消息队列,C/C++实现

 

9.Open-MQ

 

C++和QT实现,支持JMS

 

10.ActiveMQ-CPP

 

ActiveMQ的C++纯客户端库,用于跟ActiveMQ通信

 

11.MQ4CPP

 

一个C++实现的MQ,信息甚少

 

12.MetaQ

 

Alibaba对Kafka的改造,增加事务支持等新特性,用纯Java实现

 

13.Beanstalkd

 

一个类memcached协议设计的消息队列,C/C++实现

 

14.OpenAMQ

 

iMatix公司AMQP1.0的实现,类似rabbitMQ。C++实现。2010年项目放弃

 

15.Spread Toolkit

 

高性能的分布式分组消息系统,C++实现

 

16.SAFMQ

 

C++实现的储存转发消息队列中间件

 

17. Mosquitto

 

一个轻量级的IBM物联网连接协议的消息中间件实现,C/C++实现

 

18.MUSCLE

 

提供一个多路消息服务器和消息对象传递功能,支持C/C++

 

19.JORAM

 

一个类似OpenJMS(Sun OpenMQ)的JMS消息中间件,JAVA实现

 

 

 

Qpid

 

 

Qpid 是 Apache 开发的一款面向对象的消息中间件,它是一个 AMQP 的实现,可以和其他符合 AMQP 协议的系统进行通信。Qpid 提供了 C++/Python/Java/C# 等主流编程语言的客户端库,Qpid 提供了很多额外的 HA 特性,非常适于集群环境下的消息通信。

 

它提供了 C++ 和 Java 两个版本的 broker服务端,并支持多种语言的客户端。C++版本的服务器端具备高性能/低消耗以及RDMA支持;而Java版本的服务器则支持JMS。Qpid 还提供了一些额外的特性:

 

采用 Corosync 来保证了集群环境下的 Fault-tolerant 特性

支持 XML 类型的 Exchange,当消息格式为 XML 时,可以利用 Xquery 进行过滤

支持 plugin,用户可以方便地增加新的功能,比如新的 exchange 类型

提供了安全认证特性,任何 producer/consumer 需要和 broker 通信时,都需要提供身份认证。QPID 的安全认证使用 SSL 协议。

 

授权协议: Apache

 

开发语言: Java C/C++

 

操作系统: 跨平台

 

官网:http://qpid.apache.org 最新版本0.30发布于2014-09-26。

 

 

 

有新浪的朋友比较推荐Qpid,它比rabbitmq要轻型,比zeromq保险点!各方面的文档都比较健全。目前在openstack中作为一种可选的消息中间件服务配置。MB(WSO2 Message Broker) 基于Apache Qpid,这是一个Java项目。开源的企业服务总线(ESB) – Celtix,基于Apache Incubator项目Qpid。

 

跟Qpid有关联的其他项目主要有:

 

ActiveMQ and AMQP using Qpid Proton

 

Apache Camel and AMQP using Qpid

 

Apache Axis and AMQP using Qpid

 

Microsofe Azure using Qpid Proton

 

Apache软件基金会一级开源项目入选Qpid is a top-level project at Apache

 

Pulp 2.5程序库内容管理工具里集成有Qpid.

 

Fedora默认使用Qpid作为消息队列

 

 

 

 

 

RabbitMQ

 

 

LShift 用Erlang编写的一个开源的消息队列,支持很多的协议:AMQP,XMPP, SMTP, STOMP,重量级,更适合于企业级的开发。代理(Broker)架构,对路由(Routing),负载均衡(Load balance)或者数据持久化都有很好的支持。

 

缺点:可扩展性差,速度较慢,因为中央节点增加了延迟,消息封装后也比较大。

 

AMQP 里主要要说两个组件:Exchange 和 Queue (在 AMQP 1.0 里还会有变动),如下图所示,绿色的 X 就是 Exchange ,红色的是 Queue ,这两者都在 Server 端,又称作 Broker ,这部分是 RabbitMQ 实现的,而蓝色的则是客户端,通常有 Producer 和 Consumer 两种类型:

 

 

 

授权协议: MPL

 

开发语言: ErLang

 

操作系统: 跨平台

 

官网:http://www.rabbitmq.com/,最新版本3.4.3发布于2015-1-7

 

 

 

ØMQ(ZeroMQ)

 

 

早期需要设计可靠消息系统比如AMQP,但是这种方式引入了single-point broker。对于需要这种可靠消息系统的应用来说,需要在broker上面做相当多的事情确保可靠性以及性能。但是这样对于中小应用陷入了尴尬,为了使用这种方便的消息系统他们需要引入broker这么东西是不能够忍受的。我们需要的一种简单方便的消息传输系统,没有任何附加代价(比如所有数据都流经 broker),这就是ZeroMQ设计初衷。

 

2010年3月30日,AMQP的最初设计者iMatix公司的首席执行官Pieter Hintjens宣布iMatix将退出AMQP工作组,而且为了简单得多,快的多的ZeroMQ,将不支持可能发布的AMQP/1.0。一个非常轻量级的消息内核,专门为高吞吐量/低延迟的场景开发。ZeroMQ支持许多高级消息场景,但是你必须实现ZeroMQ框架中的各个块(比如Socket或Device等)。没有中间件架构,应用程序端点扮演了这个服务角色。部署简单,仅提供非持久性的队列。与RabbitMQ相比,ØMQ并不像是一个传统意义上的消息队列服务器,事实上,它也根本不是一个服务器,它更像是一个底层的网络通讯库,在socket API之上做了一层封装,将网络通讯、进程通讯和线程通讯抽象为统一的API接口。

 

支持C、C++、Python、.NET /Mono、Fortran和Java语言

 

授权协议: LGPL

 

开发语言: C/C++

 

操作系统: 跨平台

 

官网:http://zeromq.org/, 最新版本4.1.0发布于2014/10/14。Twitter的Storm中使用ZeroMQ作为数据流的传输,还有常见于金融界的应用中。Mongrel2是使用ZeroMQ的一个Web服务器。

 

 

 

Jafka/Kafka

 

 

LinkedIn用Scala语言开发。高吞吐量高性能支持跨语言分布式Publish/Subscribe消息队列系统,而Jafka是在Kafka之上孵化而来的。快速持久化、高吞吐、完全的分布式系统、支持Hadoop数据并行加载。

 

 

 

授权协议: Apache

 

开发语言: Scala

 

操作系统: 跨平台

 

 

 

ActiveMQ

 

 

居于两者(RabbitMQ & ZeroMQ)之间,类似于ZeroMQ,它可以部署于代理模式和P2P模式。完全支持JMS1.1和J2EE 1.4规范。跨平台的,多种语言和协议编写客户端,Java, C, C++, C#, Ruby, Perl, Python, PHP。应用协议: OpenWire, Stomp REST, WS Notification, XMPP, AMQP。如需配置ActiveMQ则需要在目标机器上安装Java环境。支持集群,同等网络,自动检测,TCP,SSL,广播,持久化,XA,多个消息也可以组成原子事务

 

缺点:默认的配置性能偏低,需要优化配置,但是配置文件复杂,本身不提供管理工具;示例代码非常少;主页上的文档看上去比较全面,但是缺乏一种有效的组织方式,文档只有片段,用户很难由浅入深进行了解,二来文档整体的专业性太强。

 

授权协议: Apache

 

开发语言: Java

 

操作系统: 跨平台

 

 

 

Apollo

 

 

ActiveMQ的下一代产品为Apollo,Apollo以ActiveMQ原型为基础,是一个更快、更可靠、更易于维护的消息代理工具。Apache称Apollo为最快、最强健的STOMP(Streaming Text Orientated Message Protocol,流文本定向消息协议)服务器。

 

l Apollo的特性如下:

 

l 支持Stomp 1.0和Stomp 1.1协议

 

l 主题和队列

 

l 队列浏览器

 

l 主题持久订阅

 

l 镜像队列

 

l 可靠的消息传递

 

l 消息过期和交换

 

l 消息选择器

 

l JAAS验证

 

l 基于ACL的授权

 

l 支持SSL/TLS,证书验证

 

l REST Management API

 

http://activemq.ap

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/681041.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vlan与ARP讲解

目录 Vlan讲解 Vlan标签 二层接口类型 ARP ARP的作用 ARP地址解析报文讲解 免费ARP报文讲解 ARP缓存表 Vlan讲解 Vlan(Virtual Local Area Network)虚拟局域网,将一个物理的LAN在逻辑上划分为多个广播域;可以理解为一个V…

RT-Thread-11-事件集

事件集 举例说明事件集: 1、A坐公交车去某地,只有一趟公交车去该地,等此公交车即可出发; 2、A坐公交车去某地,有三趟公交车去该地,等其中任意一辆公交车即可出发; 3、A约B一起去某地&#xff0…

点亮你的创意,使用Python与树莓派制作呼吸灯的详细教程

文章目录 前言PWM的介绍实现PWM控制LED亮度结果与分析 前言 在上一篇文章中,我们介绍了如何在树莓派上点亮一个LED灯,并让它以时间间隔为1秒进行闪烁。闪亮登场!在树莓派上点亮LED灯的简单详细方法_☞黑心萝卜三条杠☜的博客-CSDN博客。现在&…

【剑指offer刷题记录 java版】数组双指针 之 其它题目

本系列文章记录labuladong的算法小抄中剑指offer题目 【剑指offer刷题记录 java版】数组双指针 之 其它题目 剑指 Offer II 018. 有效的回⽂剑指 Offer 58 - I. 翻转单词顺序剑指 Offer 21. 调整数组顺序使奇数位于偶数前⾯剑指 Offer 57. 和为s的两个数字剑指 Offer II 007. 数…

【裸机开发】IRQ 中断服务函数(三)—— 中断处理逻辑实现

实现了 IRQ 中断服务函数的汇编部分以后,接下来我们要使用C代码实现IRQ中断服务函数的具体逻辑,主要包含初始化和中断处理两部分。 全局中断初始化(全局中断使能、IRQ中断使能)具体中断处理逻辑实现 我们这里的中断是由按键产生…

springboot+mybatisplus复习笔记

1.环境搭建 依赖配置 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>com.mysql</groupId><artifa…

【Twitter爬虫】Twitter网络爬虫

利用selenium爬取Twitter 从2月9日起&#xff0c;Twitter不再支持免费访问Twitter API&#xff0c;继续使用Twitter API支付较高的费用。下面将介绍一种绕过Twitter API爬取推文的方式 Selenium Webdriver框架 首先介绍一下Selenium Webdriver&#xff0c;这是一款web自动化…

软件工程实践总结

前言 这次我们学校花了很多心血在这次的课设上&#xff0c;真的是特别感动和感谢&#xff0c;当你遇到真心为你好对你好的老师的时候&#xff0c;真的是会觉得人间值得&#xff01; 之前在学软件工程的时候我就会觉得这些理论的东西有什么用啊&#xff0c;什么UML&#xff0c;…

冒泡排序、选择排序、插入排序

冒泡排序 思路&#xff1a; 每次循环比较相邻两个元素&#xff0c;如果左边元素>右边元素&#xff0c;则交换位置。结果&#xff1a;将最大值放到最右边&#xff1b;一次循环过后&#xff0c;左边无序区域减少一个数&#xff0c;右边有序取增加一个数&#xff1b;序列长度…

【C++】AVL树的插入实现

目录 AVL树的概念AVL树节点的定义AVL树的插入AVL树的旋转左单旋(parent->_bf 2 && cur->_bf 1)a,b,c当高度为0a,b,c当高度为1a,b,c当高度为2a,b,c当高度为...... 右单旋(parent->_bf -2 && cur->_bf -1)a,b,c当高度为0a,b,c当高度为1a,b,c当高…

【群智能算法】基于浣熊优化算法的工程应用问题优化【Matlab代码#43】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第5节&#xff1a;资源获取】1. 原始COA算法1.1 开发阶段1.2 探索阶段 2. 工程应用问题优化2.1 压力容器设计2.2 拉压弹簧设计 3. 部分代码展示4. 仿真结果展示5. 资源获取 【可更换其他算法&#xff0c;获取资源请见文章…

Spring事件机制让你的代码更优雅

今天为大家分享一下Spring的事件机制的使用&#xff0c;它是spring中一个非常好用也很实用的机制。 1. spring事件机制的概念 Spring的事件机制是基于观察者模式实现的&#xff0c;它可以在我们的实际应用程序中实现代码之间的解耦&#xff0c;提高代码的可维护性和可扩展性。…

ShardingSphere-Proxy 分库分表

安装ShardingSphere-Proxy 中间件封装 定位为透明化的数据库代理端&#xff0c;提供封装了数据库二进制协议的服务端版本&#xff0c;用于完成对异构语言的支持。 目前提供 MySQL 和 PostgreSQL版本&#xff0c;它可以使用任何兼容 MySQL/PostgreSQL 协议的访问客户端&#x…

面试必问:四种经典限流算法

今天给大家分享一下限流方面的&#xff0c;大家都知道&#xff0c;在分布式系统中&#xff0c;高并发场景下&#xff0c;为了防止系统因突然的流量激增而导致的崩溃&#xff0c;同时保证服务的高可用性和稳定性&#xff0c;限流是最常用的手段。希望能够给大家带来帮助&#xf…

STM32常见面试题

一、STM32F1和F4的区别&#xff1f; 内核不同&#xff1a;F1是Cortex-M3内核&#xff0c;F4是Cortex-M4内核&#xff1b; 主频不同&#xff1a;F1主频72MHz&#xff0c;F4主频168MHz&#xff1b; 浮点运算&#xff1a;F1无浮点运算单位&#xff0c;F4有&#xff1b; 功能性能&…

【无标题】vue中表单绑定v-model

表单绑定v-model 表单控件在实际开发中是非常常见的。特别是对于用户信息的提交&#xff0c;需要大量的表单。 Vue中使用v-model指令来实现表单元素和数据的双向绑定。 案例的解析&#xff1a; 当我们在输入框输入内容时 因为input中的v-model绑定了message&#xff0c;所以会…

Vue-搭建Vuex开发环境

1 安装Vuex 安装之前需要了解一个版本问题&#xff0c;在vue2中&#xff0c;要用vuex的3版本&#xff0c;在vue3中&#xff0c;要用vuex的4版本&#xff0c;要严格遵循这个版本要求&#xff0c;不然就会出现各种意想不到的问题&#xff0c;例如下方安装报错&#xff0c;就算因…

ubuntu修改应用图表|任务栏收藏|快捷方式|收藏夹

需要知道应用程序对应的.desktop文件的位置&#xff0c;然后使用sudo gedit打开。修改对应位置的信息就可以了。 参考&#xff1a;Linux下Desktop文件入门 1.desktop文件位置 一般存放在/usr/share/applications这个位置里面。 以vscode为例&#xff0c;使用sudo gedit code…

POJ - 2287 Tian Ji -- The Horse Racing

题目来源 2287 -- Tian Ji -- The Horse Racing (poj.org) 题目描述 田忌赛马是中国历史上一个著名的故事。 这个故事发生在2300年前&#xff0c;田忌是齐国的一个大官&#xff0c;他喜欢和齐王以及其他公子赛马。 田忌和齐王都有三类马&#xff0c;分别是下等马&#xff0…