RabbitMQ
RabbitMQ是什么
RabbitMQ是一个消息代理器:它接受和转发消息。你可以把它当作一个邮局:当你把邮件放在信箱里时,你可以肯定邮差先生最终会把邮件送到你的收件人那里。在这个比喻中,RabbitMQ就是这里的邮箱,邮局和邮差
队列类比一个邮箱,存在于RabbitMQ, 然而信息流通过RabbitMQ和您的应用程序,他们只能存储在一个队列。队列只受主机内存和磁盘限制的约束,它本质上是一个很大的消息缓冲区。会有许多生产者可以发送到一个队列的消息,许多消费者可以尝试从一个队列接收数据
hello world
生产者
消费者
代码:hello world
work Queues
工作队列(又名任务队列)背后的主要思想是避免立即执行资源密集型任务,必须等待它完成。相反,我们计划稍后完成任务。我们将任务封装为消息并将其发送到队列中。后台运行的一个工作进程将弹出任务并最终执行该任务。当你运行许多工人(消费者)时,任务将在他们之间分担。
ACK
为了确保消息不会丢失,RabbitMQ支持消息确认。ACK(nowledgement)消费者返回的结果告诉RabbitMQ有一条消息收到,你可以自由可控的删除他
如果一个消费者中止了(其通道关闭,连接被关闭,或TCP连接丢失)不发送ACK,RabbitMQ将会理解这个消息并没有完全处理,将它重新加入队列。如果有其他用户同时在线,它就会快速地传递到另一个消费者。这样,即使意外中止了,也可以确保没有丢失信息。
使用此代码,我们可以确信,即使在处理消息时使用Ctrl + C杀死一名消费者,也不会丢失任何东西。消费者中止都未确认的消息后很快会被重新分配。
消息持久化
对已经定义的没有持久化的队列,改变使其持久化,将不起作用,除非重新定义一个新的队列
$msg = new AMQPMessage($data, array('delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT) );
将消息标记为持久性不能完全保证消息不会丢失。虽然它告诉RabbitMQ保存信息到磁盘上,还有一个短的时间窗口时,RabbitMQ 已经接受信息并没有保存它。另外,RabbitMQ不做磁盘同步每一个消息--它可能只是保存到缓存并没有真正写入到磁盘。持久性保证不强
公平调度
交换机
RabbitMQ消息传递模型的核心思想是,生产者不发送任何信息直接到队列。事实上,生产者甚至不知道消息是否会发送到任何队列。
生产商只能向交换机(Exchange)发送消息。交换机做的事情很简单。一方面,它接收来自生产者的信息,另一边则推他们排队。
交换机的类型:
- direct
这种模式会处理路由键,也就是所谓的按需索取。需要将一个队列绑定到exchange上面,要求该消息与一个特定的路由键完全匹配。消息才会进入到该队列中。如果一个队列绑定到该交换机上要求路由键 “dog”,则只有被标记为“dog”的消息才被转发,不会转发dog.puppy,也不会转发dog.guard,只会转发dog。
-
topic
这种模式和Direct模式的原理是一样的,都是根据路由键进行消息的路由,但是这种支持路由键的模糊匹配,此时队列需要绑定要一个模式上。符号“#”匹配一个或多个词,符号“*”匹配不多不少一个词
-
fanout
交换机(Exchange)里的消息发送给所有绑定该交换机的队列,忽略routingKey,相当广播