假设你是一个队列服务的Ruby客户端,例如RabbitMQ。等待消息是如何实现的,这样您就不会进行消耗资源的活动轮询了?这直接来自Ruby阻塞值的问题——如果AMQP客户端可以有效地做到这一点,人们可以用Memcached读取做类似的事情……总的来说,对于RabbitMQ和这样的使用,我们必须让自己确信等待是明智的!
在Ruby世界中,这主要是通过使用异步事件驱动的I/O来完成的。如果你看一下GitHub中的ampq客户端,它支持两个库,EventMachine和Cool.IO。
它实际上是轮询,但是等待循环是在操作系统内核的帮助下完成的。例如,如果在Linux上运行,EventMachine将使用类似epoll的东西。
当期望的事件被触发时,你的回调函数被调用。如果你想深入了解EventMachine的工作原理,可以点击这里。
AMPQ客户端仍然通过套接字与队列服务器通信,但是api将等待循环和通知延迟到OS内核。