场合
就我而言,有一个MQ服务器用于排队作业。作业完成后,作业结果需要写入数据库。我需要编写一个或多个程序来使作业出列,处理作业并将作业结果写入数据库。我脑子里有一些设计,但我不确定应该选择哪一个,也不确定设计的优缺点。
虽然有一些要求,但程序应该尽力确保:
在我的情况下,性能并不是很重要,因为处理一项工作可能需要至少10秒。但是我还是想要一个好的设计,这样我就可以在以后考虑性能时重复使用它。
设计1
将创建许多线程并单独工作。每个线程都将从MQ服务器中取出作业,处理作业并将作业结果写入数据库。之后,线程再次循环以使作业出列。
到MQ服务器的会话数和到数据库服务器的连接数将与线程数相同。如果考虑性能,这应该是一个问题。
设计2
创建一个调度程序线程以将作业从MQ服务器出列并分派到工作线程池。每个工作线程单独工作以处理作业并将作业结果写入数据库。
设计3
创建一个调度程序线程以将作业从MQ服务器出列并分派到工作线程池。每个工作线程都单独工作以处理作业。作业完成后,工作线程将把作业结果传递给MQ服务器中的另一个队列。另一个数据库线程将从MQ服务器中取出作业结果,并将结果写入数据库。
如果数据库服务器关闭,此设计可以提供帮助,这样程序仍然可以处理作业而不会丢失作业结果。
设计4
将创建许多线程并单独工作。每个线程都将从MQ服务器中取出作业并处理该作业。作业完成后,工作线程将把作业结果传递给MQ服务器中的另一个队列。许多数据库线程将使MQ服务器的作业结果出列,并将结果写入数据库。
对我来说,这看起来是最好的设计,它避免了调度程序的复杂设计,并且能够在数据库服务器关闭时利用排队作业结果。
其他设计
还有一些设计可以想到。它们类似于上述3种设计,但仅适用于将作业结果写入数据库部分。因此我不打算再次列出。
备注
这是我第一次参与MQ服务器项目。
答案 0 :(得分:1)
我认为您需要阅读IBM MQ(也称为WebSphere MQ)。 MQ不处理'工作' - 它处理消息。 MQ只有一次,只有一次'传递信息并确保传递(用于持久信息)。
设计#2& 3是一个非常糟糕的主意。您正在解耦进程,如果调度程序或工作线程崩溃(WHICH HAPPENS),则消息将丢失。当然,应用程序支持团队会责怪MQ,因为他们不能责怪自己创建一个可怕的系统。
只要您使用两阶段提交(读取MQ ETC),设计#1就是好的。
如果您的数据库出现故障,请使用设计#4。对MQ线程使用单阶段提交,对数据库线程使用两阶段提交。