一.中间件
1.什么是中间件
中间件:是提供软件和软件之间连接的软件,以便于软件各部分之间的沟通。
二.消息中间件
1.同步调用消息
缺点:
(1)业务链调用时间过长,用户等待时间较长
(2)如果某个服务宕机,那么整个业务将无法进行
(3)业务高峰期时没有缓冲(当某个服务处理性能较弱时,整个业务会受到影响,也就是短板)
2.异步调用消息(使用异步线程)
缺点:
(1)业务高峰期时会开启大量异步线程,会造成异步线程池数量不足和内存爆满等情况。
3.使用消息中间件
优点:
(1)业务调用链短,用户等待时间短。
(2)如果某个服务宕机,不会瘫痪整个业务。
(3)业务高峰期有缓存(如果业务量超过了服务的处理量,那么这些多余的消息会保存在消息中间件中)。
(4)业务高峰期时不会产生大量的异步线程。
4.消息中间件的作用
(1)异步处理*
(2)系统解耦*
(3)流量削峰和流控
(4)消息广播:某个服务向多个服务进行发送消息。
(5)消息收集:多个服务向某个服务发送消息。
(6)最终一致性:某个消息发出去是会被处理的
5.ActiveMQ
优点:
(1)基于Java,可以跨平台运行
(2)可以使用JDBC连接多种数据库
(3)有完善的界面,监控,安全机制
(4)有自动重连和错误重试
缺点:
(1)不适用于上千个队列的使用场景
(2)社区活跃度较低,Bug修复较慢
6.RabbitMQ
(1)当前最主流的消息中间件
(2)高可靠性,支持发送确认,投递确认等特性
(3)高可用,支持镜像队列
(4)支持插件
优点:
(1)基于Erlang,支持高并发
(2)支持多种平台,多种客户端,文档齐全
(3)可靠性高
(4)在互联网公司有大规模应用,社区活跃度高
缺点:
(1)Erlang语言较为小众,不利于二次开发
(2)代理架构下,中央节点增加了延迟,影响性能
(3)使用AMQP协议,使用起来有学习成本
7.RocketMQ
(1)能够保证严格的消息顺序
(2)亿级的消息堆积能力
(3)丰富的消息拉取模式
优点:
(1)基于Java,方便二次开发
(2)单机支持1万以上持久化队列
(3)内存与磁盘都有一份数据,保证性能+高可用
(4)开发度较活跃,版本更新很快
缺点:
(1)客户端种类不多,较成熟的是Java和C++
(2)没有Web管理界面,提供了一个CLI(命令行界面)
(3)社区关注度及成熟度不如RabbitMQ
8.kafka
(1)Linkedln开发的分布式日志提交系统
(2)独特的分区特性,适用于大数据系统
(3)性能高效,可扩展性良好
(4)可复制,可容错
优点:
(1)原生的分布式系统
(2)零拷贝技术,减少IO的操作步骤,提高系统的吞吐量
(3)快速持久化,可以在O(1)的系统开销下进行消息持久化
(4)支持数据批量发送和拉取
缺点:
(1)单机超过64个队列/分区时,性能明显劣化
(2)使用短轮询方式,实时性取决于轮询间隔时间
(3)消费失败不支持重试
(4)可靠性比较差
9.RabbitMQ高性能的原因
基于Erlang语言开发(一款专门为交换机软件开发的语言)
Erlang的特点:
(1)通用的面向并发的变成语言,适用于分布式系统。
(2)基于虚拟机解释运行,跨平台。
(3)进程间上下文切换效率大于C语言。
(4)有着和远程Socket一样的延迟。
三.AMOP协议
AMQP协议规定了RabbitMQ对外的接口。
![]()
(1)Broker:接收和分发消息的应用,RabbitMQ就是Message Borker。
(2)Virtual Host:虚拟Boker,将多个单元分隔。
(3)Connection:publisher/consumer和broker之间的TCP连接。
(4)Channer:connection内部建立的逻辑连接,通常每个线程创建单独的channel。
(5)Routing key:路由键,用来指示消息的路由转发,相当于快递地址。
(6)Exchange:交换机,相当于快递分拨中心。
(7)Queue:消息队列,消息最终被送到这里等待consumer取走。
(8)Binding:exchange和queue之间的虚拟连接,用于Message的分发依据。
exchange是AMQP的核心组件,exchange承担了RabbitMQ的核心功能(路由转发),exchange有多个种类。
1.exchange(RabbitMQ的核心)
exchange的作用:
(1)exchange是AMQP协议和RabbitMQ的核心组件。
(2)exchange的功能是根据'绑定关系'和'路由键'为消息提供路由,将消息转发至相应的队列/
(3)exchang有4种类型:Direct/Topic/Fanout/Headers(Headers使用很少)
2.exchang分类
2.1 Direct Exchange
Message中的Routing Key如果和Binding Key一致,Direct Exchange就会将message发送到对应的queue当中去。
![]()
2.2 Fanout Exchange
每个发到Fanout exchange的message都会分发到所有绑定的queue上去。
![]()
2.3 Topit Exchange
(1)根据Routing Key及通配规则,topit exchange将消息分发到目标queue当中去
(2)当topit全匹配时,与direct类似
(3)Binding Key中的'#':可以匹配任意个数的word
(4)Binding Key中的'*':可以匹配一个word
![]()
3. RabbitMQ命令行操作
(1)查看状态:rabbitmqcli status
(2)查看绑定:rabbitmqcli list_bindings
(3)查看channel:rabbitmqcli list_channel
(4)查看connection:rabbitmqcli list_connections
(5)查看消费者:rabbitmqcli list_consumers
(6)查看交换机:rabbitmqcli list_exchanges