生产消费模式下多消费者的先后顺序保证方案

消息队列中的任务,按照先进先出的原则,在单进程模式下没有任何问题。但是如果生产的速度太快,或者消费过程比较耗时,很可能会有任务积压的情况发生。此时可能我们会使用多进程、线程消费,这样无疑是最简单的解决方案。但是如果队列中的消息有顺序限制,这样就会出现问题,因为多个消费者,你不知道哪个消费者会最先执行完成。

上面说的可能有些不太明白,举个例子:我先发布了一篇文章,后来修改了,然后删除了。这些操作都被塞进了一个队列,有多个进程会取出这个队列中的任务,进行操作,一般情况下,取出任务会很快,这些进程几乎同时拿到任务,如果插入文章的时候比较耗时,它还没有完成这个任务,更新和删除的进程已经在执行了,这肯定会有问题。

我想到的解决方案,对于队列中的任务,可以根据唯一标识进行一个hash,根据hash值分配到N多个队列中,每个队列都有一个消费者去消费,这样,就能保证同一篇文章的操作能够阻塞的进行,在文章插入之前,是无法进行更新和删除操作的。