【发布时间】:2015-08-20 08:07:16
【问题描述】:
情况
在我的例子中,有一个 MQ 服务器用于排队作业。作业完成后,需要将作业结果写入数据库。我将需要编写一个或多个程序来使作业出队、处理作业并将作业结果写入数据库。我脑子里有一些设计,但我不确定我应该选择哪一个,也不确定这些设计的优缺点。
虽然有一些要求,但程序应尽量确保:
- 在服务器时不重复处理作业(假设作业正在发送电子邮件,您不希望客户收到 2 封相同内容的电子邮件)
- 作业结果不丢失(以便您通过查询数据库知道作业结果)。
在我的情况下,性能并不是很重要,因为处理一项工作可能至少需要 10 秒。但是,我仍然想要一个好的设计,以便以后在考虑性能时可以重复使用它。
设计 1
将创建多个线程并单独工作。每个线程将从 MQ 服务器中取出一个作业,处理该作业并将作业结果写入数据库。之后,线程再次循环出列作业。
与 MQ 服务器的会话数和与数据库服务器的连接数将与线程数相同。如果性能是一个问题,这应该是一个问题。
设计 2
创建一个调度程序线程以从 MQ 服务器出列作业并调度到工作线程池。每个工作线程单独工作以处理作业并将作业结果写入数据库。
设计 3
创建一个调度程序线程以从 MQ 服务器出列作业并调度到工作线程池。每个工作线程单独工作以处理作业。作业完成后,工作线程会将作业结果传递到 MQ 服务器中的另一个队列。另一个数据库线程将从 MQ 服务器中取出作业结果并将结果写入数据库。
这种设计可以在数据库服务器宕机时提供帮助,这样程序仍然能够处理作业而不会丢失作业结果。
设计 4
将创建多个线程并单独工作。每个线程将从 MQ 服务器中取出一个作业并处理该作业。作业完成后,工作线程会将作业结果传递到 MQ 服务器中的另一个队列。多个数据库线程将作业结果从 MQ 服务器中取出,并将结果写入数据库。
在我看来,这似乎是最好的设计,它避免了调度程序的复杂设计,并且能够在数据库服务器关闭时利用排队作业结果。
其他设计
还有更多可以想到的设计。它们与上述 3 种设计类似,但仅适用于将作业结果写入数据库部分。所以我就不一一列举了。
备注
这是我第一次做 MQ 服务器项目。
【问题讨论】:
标签: multithreading message-queue mq