html5移动网站开发实例,2022最火的新零售模式,曼联vs曼联直播,网站建设360云栖号资讯#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯#xff0c;还在等什么#xff0c;快来#xff01; 说到消息中间件#xff0c;大部分人的第一印象可能是Kafka。毕竟Kafka自问世以来#xff0c;就顶着高并发#xff0c;大流… 云栖号资讯【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯还在等什么快来 说到消息中间件大部分人的第一印象可能是Kafka。毕竟Kafka自问世以来就顶着高并发大流量的光环。当然了Kafka也不负众望在大数据处理方面一直独领风骚。
这里想说说另一款同样优秀的消息中间件RabbitMQ。
选RabbitMQ还是Kafka
如果单机数据量没有到十万级以上我觉得选哪个都OK如果超过百万甚至到了千万级那么建议选择Kafka。
对了还有重要的一点RabbitMQ支持事务而Kafka不支持。所以如果你的业务系统要求支持事务那么只能选RabbitMQ。这也是很多金融系统选择RabbitMQ作为消息中间件的原因。
RabbitMQ基本概念
先来说一下消息中间件的通用模型所有的消息中间件的模型基本都是这样。 而RabbitMQ是基于AMQP协议实现的。模型大概是这个样子如下图所示 重点关注中间两个框框下面依次解读一下。
信道
建立TCP链接是一件很费时的事情所以很多提供高并发服务的软件都支持TCP链接复用比如HTTP协议的KeepAlive就是为了复用TCP链接准备的。所以RabbitMQ提出了信道的概念一个TCP链接里面可以支持多个信道同时通信以提高通信效率。如下图所示。 broker
一个启动的RabbitMQ实例代表一个broker。
虚拟主机
虚拟主机可以理解成命名空间的概念方便队列管理。
交换器
向RabbitMQ发送消息时先把消息先发到交换器再由交换器根据相关路由规则发到特定队列上。目前 RabbitMQ的交换器共四种类型direct、fanout、topic、headers。
headers交换器 匹配消息的header而不是路由键除此之外headers交换器和direct交换器完全一致但性能差很多所以目前几乎不用。
direct交换器 消息中的路由键routing key如果和Binding绑定的概念后面会介绍中的 binding key 一致 交换器就将消息发到对应的队列中。direct模式是完全匹配的单播模式也就是说路由键与队列名完全匹配如果一个队列绑定到交换机要求路由键为“dog”则只转发 routing key 标记为“dog”的消息不会转发“dog.puppy”的消息。如下图所示。 fanout交换器每个发送到fanout交换器中的消息不会去匹配路由键而是直接把消息投递到所有绑定到fanout交换器上的队列中。类似一个广播站会向所有收听广播的用户发送消息。对应到实际应用中它允许你针对一个消息作不同操作比如用户上传了一张新的图片系统要同时对这个事件进行不同的操作比如删除旧的图片缓存、增加积分奖励等等。这样就大大降低了系统之间的耦合度了。 如下图所示。 topic交换器topic交换器和direct交换器有相似之处它通过模式匹配的方式分发消息将路由键和某个模式进行匹配此时队列需要绑定到一个模式上。它将路由键和绑定键的字符串切分成单词这些单词之间用点隔开。它同样也会识别两个通配符符号#和符号。#匹配0个或多个单词匹配至少一个单词。如下图所示。 绑定
将消息队列和交换器进行关联。一个绑定就是基于路由键将交换器和消息队列连接起来的路由规则所以可以将交换器理解成一个由绑定构成的路由表如下图所示 集群及高可用
因为RabbitMQ是Erlang开发的所以天生支持分布式。所谓的天生支持的意思就是不用像Kafka那样借助ZK来实现集群。
先来看一下典型的RabbitMQ集群架构图。 集群分为普通模式和镜像模式。另外RabbitMQ集群分为内存节点和磁盘节点集群当中必须存在磁盘节点。内存节点就是将数据存储到内存中读写效率会比较高而磁盘节点是将数据存储到磁盘上面可以持久化保存数据。
普通模式默认的集群模式。所谓的普通模式就是多台机器上启动多个Rabbitmq实例每台机器启动一个实例。但是创建的queue只会放在一个Rabbtimq实例上每个实例都会同步queue的元数据。消费的时候如果连接到了另外一个实例那么那个实例会从queue所在实例上拉取数据过来。如果存放queue的节点挂掉那么就不能提供服务了。所以这种方式并不是真正的高可用。
镜像模式创建的queue无论元数据还是消息都会存在于多个实例上每次写消息到queue的时候都会自动把消息同步到多个实例的queue里。任何一个节点挂掉后其他节点可以继续提供服务。类似于Redis集群的哨兵模式。关于Redis的高可用部署方式可以看我这篇文章。
元数据
元数据主要包含四类分别是
队列元数据队列名称及属性交换器元数据交换器名称、类型及属性绑定元数据记录了如何将消息路由到队列的数据vhost元数据为队列、交换器和绑定提供命名空间和安全属性的数据
运维常用管理命令
启动 /sbin/rabbitmq-server
重启 /sbin/rabbitmqctl reset
停止 /sbin/rabbitmqctl stop
停止应用 /sbin//rabbitmqctl stop_app
查看RabbitMQ状态 /sbin/rabbitmqctl status
查看绑定 /sbin/rabbitmqctl list_bindings
查看交换器 /sbin/rabbitmqctl list_exchanges
查看已声明的队列 /sbin/rabbitmqctl list_queues
stop和stop_app 的区别
这里需要特别注意一下这两个命令的区别由于 RabbitmMQ是用Erlang写的Erlang有节点的概念也就是在一个Erlang节点上可以运行很多个Erlang应用stop命令是使得整个Erlang节点停止工作而stop_app则是使得当前应用停止工作不会影响其它应用的正常运行。
总结
如果之前一直接触的Java开发的中间件突然接触RabbitMQ会有些许不适应。特别是对于RabbitMQ的集群部署及高可用的理解。不过了解之后会发现这只兔子还是很可爱的。毕竟存在就有存在的道理。 【云栖号在线课堂】每天都有产品技术专家分享 课程地址https://yqh.aliyun.com/live 立即加入社群与专家面对面及时了解课程最新动态 【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK 原文发布时间2020-07-17 本文作者花括号MC 本文来自“掘金”了解相关信息可以关注“掘金”
原文链接
本文为云栖社区原创内容未经允许不得转载。