当动物保护遇上机器学习
生产者是发布者,消费者是订阅者,消息是主题 为了提高消费的并行度,一类消息会被分发到多个队列中,在RocketMQ中叫Queue,在Kafka中叫做Partition(分区),都是类似的概念。 AMQP协议详解
前面说到消息中间件有2种协议,JMS和AMQP。JMS你可以类比为JDBC,搞了一套接口让不同厂商来实现这个接口,但是这个协议设计的确实不够优雅,因此就不介绍这个协议了,除非你用ActiveMQ,不然学了真没啥用。详细说一下AMQP协议,毕竟现在用RabbitMQ的公司还是很多的,要想学好RabbitMQ,AMQP协议是必须要清楚的。 所以一个简单的消息队列用Redis中的List就能实现。当然Redis5.0版本之后针对消息队列这种场景专门设计了一个数据结构Streams。 队列模型有哪些缺点呢? 如果将一类消息发送给不同的消费者,每个消费者都要接收全量的消息,此时就很不方便。因为你要将相同的消息发送到不同的队列,多一个消费者就得多发一份队列。这样生产者必须知道有多少个消费者,不利于解耦。 那么该如何解决这个问题呢?
想想RabbitMQ的结构图
消息模型 如果让你设计一个消息队列?你会怎么实现呢?
可能你立马就会想到用队列,一边放,一边取。这其实就是消息队列常见的一种消息模型,队列模型 初见曙光 1.消息中间件其实诞生的很早,在互联网应用还是一片荒芜的年代,有个在美国的印度哥们Vivek Ranadive就设想了一种通用软件总线,采用发布订阅的模式,像主板上的总线一样供其他相应程序接入。他创办了一家公司Teknekron,实现了世界上第一个消息中间件The Information Bus(TIB) 各自为战 2.TIB受到了企业的欢迎,Teknekron的业务发展引起了当时最牛气的IT公司IBM的注意,于是他们也开始研发了自己消息队列软件,于是才有了后来的wesphere mq,微软也陆续加入了战团。由于商业壁垒,商业MQ供应商想要解决应用应用互通的问题,而不是去创建标准来实现不同MQ产品间的互通,或者允许应用程序更改MQ平台 劫制天下 3.为了打破这个壁垒,同时为了能够让消息在各个消息队列平台间互融互通, JMS (Java Message Service) 应运而生 。JMS 试图通过提供公共 Java API 的方式,隐藏单独 MQ 产品供应 商提供的实际接口,从而跨越了壁垒,以及解决了互通问题。从技术上讲, Java 应用程序只需 针对 JMS API 编程,选择合适的 MQ 驱动即可, JMS 会打理好其他部分 。ActiveMQ 就是 JMS 的 一种实现 。不过尝试使用单独标准化接口来胶合众多不同的接口,最终会暴露出问题,使得 应用程序变得更加脆弱 。所以急需一种新的消息通信标准化方案 。 一统江湖 4.在 2006 年 6 月,由 Cisco 、 Redhat 、iMatix 等联合制定了 AMQP 的公开标准,由此 AMQP 登上了历史的舞台 。它是应用层协议的一个开放标准,以解决众多消息中间件的需求和拓扑结 构问题 。它为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受 产品、开发语言等条件的限制 。 合久必分 5.LinkedIn在实现消息队列的时候觉得AMQP规范并不适合自己,所以Kafka并不支持AMQP协议。RocketMQ在实现上借鉴了Kakfa的思想,所以也不支持AMQP协议,并且你会发现在Kafka和RocketMQ中都有类似Topic和Consumer Group的概念,而这些概念在AMQP协议中是不存在的
如何选择消息中间件 (编辑:信阳站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |