MQ总结

MQ总结

消息队列(MessageQueue,简称MQ):是在消息的传输过程中保存消息的容器。

MQ框架非常之多,比较流行的有RabbitMq、ActiveMq、ZeroMq、kafka,以及阿里开源的RocketMQ。

为啥要用MQ:

1.解耦:传统模式:系统间耦合性太强,如图所示,系统A在代码中直接调用系统B和系统C的代码,如果将来D系统接入,系统A还需要修改代码,过于麻烦!中间件模式:将消息写入消息队列,需要消息的系统自己从消息队列中订阅,从而系统A不需要做任何修改。

2.异步:传统模式: 一些非必要的业务逻辑以同步的方式运行,太耗费时间。中间件模式: 将消息写入消息队列,非必要的业务逻辑以异步的方式运行,加快响应速度。

3.削锋:传统模式:并发量大的时候,所有的请求直接怼到数据库,造成数据库连接异常。中间件模式: 系统A慢慢的按照数据库能处理的并发量,从消息队列中慢慢拉取消息或者只处理前100条消息。

MQ的好处:

可靠性、灵活的路由、集群、事务、高可用的队列、消息排序、问题追踪、可视化管理工具、插件系统等等。RabbitMq / Kafka 最好,ActiveMq 次之,ZeroMq 最差。当然ZeroMq 也可以做到,不过自己必须手动写代码实现,代码量不小。尤其是可靠性中的:持久性、投递确认、发布者证实和高可用性。

RabbitMQ是一个使用 erlang 编写的 AMQP(高级消息队列协议)的服务实现,简单来说,就是一个功能强大的消息队列服务。

rabbitmq里边有5种数据传递方式:

第一种是简单模型,一个生产者,一个队列,一个消费者,队列只能被一个消费者监听,所以生产者将消息发给队列之后,只能有一个消费者收到消息

第二种是工作模型,一个生产者,一个队列,多个消费者,队列可以被多个消费者监听,但是生产者将消息发给队列之后,还是只能有一个消费者接收到消息

第三种是fanout类型,这种叫广播模式,生产者将消息发送给交换机,交换机会将消息转发给所有绑定到到当前交换机的队列中,对应监听队列的消费者都能收到消息,但是,如果没有队列绑定到这个交换机,消息会被mq丢弃。

第四种是direct类型,这种叫定向模式,也叫路由模式,这种模式中,队列在绑定交换机的时候,同时指定了自己的routing key,可以理解为一个路由标示,生产者在发送消息给交换机的时候,同时指定要发送给的routing key,这时候,交换机就会根据这个routing key来定向的发送给对应的队列,对应监听该routing key的队列的消费者就能收到消息,但是如果交换机没有找到对应的routing key,消息会被丢弃。

第五种是topic模式,这种叫通配符模式,队列在绑定交换机的时候,同时指定了自己的routing key,生产者在发送消息给交换机的时候,同时指定要发送给的routing key 的通配符,一般这个routing key是由多个单词用.的方式隔开的,通配符中,#号可以匹配一个或者多个单词,*号只能匹配一个单词,例如生产者指定的通配符为a.#,可以匹配到的routing key有:a.ba.b.c等,如果是a.*的话,只能匹配a.b或者是a.c这样的routing key。每个队列绑定到交换机的时候可以定义多个routing key,交换机会跟据指定的通配符,发送到匹配通配符的routing key 对应的队列中,对应的消费者就可以收到消息了,但是,如果没有符合通配符的routing key ,消息会被丢弃。

选型和对比

1.从社区活跃度

按照目前网络上的资料,RabbitMQ 、activeMQ 、ZeroMQ 三者中,综合来看,RabbitMQ是首选。

2.持久化消息比较

ZeroMq不支持,ActiveMq 和RabbitMq 都支持。持久化消息主要是指我们机器在不可抗力因素等情况下挂掉了,消息不会丢失的机制。

3.综合技术实现

可靠性、灵活的路由、集群、事务、高可用的队列、消息排序、问题追踪、可视化管理工具、插件系统等等。RabbitMq / Kafka 最好,ActiveMq 次之,ZeroMq 最差。当然ZeroMq 也可以做到,不过自己必须手动写代码实现,代码量不小。尤其是可靠性中的:持久性、投递确认、发布者证实和高可用性。

4.高并发

毋庸置疑,RabbitMQ 最高,原因是它的实现语言是天生具备高并发高可用的erlang 语言。

5.比较关注的比较, RabbitMQ和 Kafka

RabbitMQ比Kafka 成熟,在可用性上,稳定性上,可靠性上, RabbitMq 胜于 Kafka (理论上)。另外,Kafka 的定位主要在日志等方面, 因为Kafka 设计的初衷就是处理日志的,可以看做是一个日志(消息)系统一个重要组件,针对性很强,所以如果业务方面还是建议选择 RabbitMq 。还有就是,Kafka 的性能(吞吐量、TPS )比RabbitMq 要高出来很多

上一篇:树莓派学习笔记(5):成功实现NAS家庭服务器(流媒体播放、文件共享及下载机)


下一篇:php-Symfony 3路由:未找到“ GET / user / add”的路由