我已经编写了一个基于pheanstalk (beanstald)的队列管理器,并且我正在决定将什么类型的操作通过这个系统。队列管理器可以发送和读取3个不同的优先级管道:快、中、慢。
优先级的差异是执行时间。快速队列中的操作将拥有最多的工作进程,并且应该在添加到队列后几乎立即执行。Medium需要更少的工人,slow需要更少的工人。
我们有大量的行动,毫无疑问会通过中速或慢速通道的队列。但是我们也有对单个记录的单个操作(由一个到几个快速查询组成),用户将需要立即反馈。
初始的非队列方法很简单:
- 点击执行动作,ajax并等待响应,成功后显示。
使用queue的方法是:
- Ajax操作,发送到队列,刷新可视化表示,并希望队列系统在刷新数据之前完成操作
我可以增加快速队列的工人,这样在管道中就不会有任何挂起的操作,但我永远无法保证操作将在数据刷新之前完成。
这个问题有什么常见的解决方案/模式?
对于Beanstalkd,这是非常微不足道的-它有优先级。
给定来自多个管道/队列中的一个的两个作业,在其他条件相同的情况下,最接近0的优先级将被保留,并首先给出。
大多数工人可以观看所有的管道,无论如何他们总是得到最重要的工作。一个小子集只监视fast
管,因此总是有最重要的工作线程可用。如果没有足够的"快"的工作,他们会得到一个中等或慢的工作来代替。
我倾向于将放入快速队列的作业的优先级设置为500,中队列为1000,慢队列为5000。我喜欢留出很大的空白,以便在需要的时候可以插入其他东西。