MQ消息队列
MQ面试目标
什么是MQ、为什么用MQ
结合实际项目讲自己用过的案例
rabbitmq/rocketmq/activemq/kafka什么区别,分别适用什么场景,怎么结合自己的业务去技术选型
MQ学习笔记
ActiveMQ在成熟度比较优秀,但是它的性能方面比较欠缺,所以在吞吐量不太高的中小型企业比较受欢欢迎;
Kafka追求高吞吐量,一般应用在大数据,一开始目的用于日志收集和传输,它不支持事务、不追求消息传递的可靠性,所以根据业务需求自行判断是否合适;
RocketMQ纯java开发,起源kafka,并不是复制kafka,基于kafka的缺点方面做了优化,比如可靠性方面,阿里对它的开源版本不支持事务,只有付费云产品才支持事务,它在阿里众多业务场景下经过不断的优化得到了逐步的完善;
RabbitMQ是Erlang语言开发的开源消息队列,基于AMQP协议实现,AMQP协议的特点的可靠性、安全性比较好,基于它的性能和可靠性以及开源社区活跃的结合考量,得到了众多企业的青睐。
AMQP和JMS的本质差别:JMS是基于API层面的限定,而AMQP是定义网络交换的数据格式
虚拟主机的作用:类似数据库中的库概念,同一个rabbitmq服务端下可以创建多个虚拟主机,便于供不同场景或不同项目共用同一服务端
提供rabbitmq的连接信息中包括了连接的用户账号和密码,而在服务端可以通过命令方式或者web管理界面中对用户的权限和虚拟主机进行管理,这样就便于程序知道连接至rabbitmq后从哪个虚拟主机中生产和消费消息
据了解可以省略交换机的模式,直接将消息放置于队列queue中
创建消费者demo代码示例(添加AMQP客户端依赖、服务端的虚拟主机/用户的创建/用户权限的设置、代码连接服务端、发布消息):
https://www.bilibili.com/video/BV1dE411K7MG?p=5&spm_id_from=pageDriver
官方示例的几种消费模型
https://www.rabbitmq.com/getstarted.html
- work queues:没有交换机
- 订阅模式:fanout,有交换机,所有消费者无条件/无过滤的接受广播
- routing:direct,有交换机,队列绑定路由key,在交换机中根据路由key获取指定消息
- topic:基于direct的功能,可以使用通配符,简化过滤规则
集群
主从复制集群:不可靠,从节点只能在队列看到队列信息,无法正常使用队列信息,如果主节点宕机,整个系统不可用
镜像集群:实际上就是rabbitmq提供的策略模式,基于主从设置策略后达到自动/手动同步,实现高可用
学习MQ疑问
怎么改端口?(默认服务端口5672/默认web管理界面端口15672/集群的端口25672)