什么是消息队列?

想象一种情景。你开了一家冰棍厂,需要把冰棍卖给市里的几百家超市。固然,你可以把所有预定冰棍的超市的名单登记下来,然后一家一家地进行发货,但是这导致工厂要负责的事情太多太杂。(工厂依赖了产品的具体用户)

抽象过程:

function factory($clients, $material){
    $products = process($material)
    $clients.forEach($c => $c.receive($products))
}

问题本质在于,引入了副作用(发货)

一个方法是工厂只负责生产商品,然后经销商负责登记具体的买家。然后经销商只需要统计一下告诉你需求总数。这样,你的工厂只负责生产,经销商负责配送,实现了职责的分离

抽象过程:

function factory($material, $messenger) {
    $products = process($material)
    $messenger.notify("product is ready", $products)
}

这样,工厂无需知道具体的客户有哪些,也可以进行生产了。

消息队列的基本功能

这里我们实现了发布订阅模式,经销商充当了消息总线,它甚至可以为其它工厂服务(灵活)。而不需要知道工厂生产的具体商品(依赖接口而非实现)—— 只要递送给客户就行。

将这个过程放在很多台服务器之间,“经销商” 所充当的,就是消息队列服务。跨网络的发布订阅,是消息队列的最基本功能。

消息队列的更多功能

消息队列还有很多复杂的功能。

Phrase 1:实现跨网络发布订阅