使用队列解耦程序

Mat*_*att 9 java jobs message-queue decoupling

在54:53分钟的谈话中,Rich Hickey正在谈论使用队列作为解耦依赖程序部分的手段.你能给我一个例子,说明如何将下面的Java伪代码分离出来,以便改进它的设计和/或灵活性:

// Warning: Java-pseudo-code ahead
class Job {
    public void doRun(A a) {
        saveObjectToDatabase(a);

        B b = computeB(a);
        saveObjectToDatabase(b);

        C c = computeC(b);
        logToFile(c);
    }
}
Run Code Online (Sandbox Code Playgroud)

saveObjectToDatabase并且saveObjectToDatabase可以看作具有副作用的方法,而computeB's和computeC's输出仅依赖于a.

我知道这个问题相当模糊/广泛.我想了解如何利用排队机制,而不会使我的程序大规模复杂化,并仍然确保它以正确的顺序做正确的事情.任何指向正确方向的人都会受到赞赏.

Hot*_*cks 4

好吧,这不是一个很好的例子,但是(在最直接的设计中)您基本上有两个队列,并且(取决于所涉及的数据量)您可能会省略数据库。

第一个进程将从a“外部世界”接收对象并将它们放入队列 1 中。第二个进程将从队列 1 中取出对象,执行computeB并将结果放入队列 2 中。第三个进程将从队列 2 中取出对象,执行computeC,并记录结果或其他内容。

正如我所说,根据所涉及的数据量(也许还​​有一些其他因素),队列中传递的“对象”可以是您的实际a对象b,也可以只是用于在数据库中查找数据的令牌/键。

队列本身可以通过多种方式实现。例如,可以用数据库实现队列,尽管细节有点混乱。“进程”可以是单个 Java 进程中的 Java 任务,也可以是单独的操作系统进程,甚至可能位于单独的机器上。

当您在 Unix 上使用“管道”时,您实际上是以这种方式使用队列。