数据库作为IPC反模式

时间:2010-09-28 18:36:05

标签: java php ipc anti-patterns

我编写了一个分层的Web应用程序,它由一个与Java服务交互的富Web客户端(PHP)组成。 Web客户端托管在apache服务器上,java服务在同一台物理计算机上运行(重申:整个应用程序,客户端和服务在同一台物理计算机上运行)。

用户请求 - > DB< - Poller - > RequestHandler - > DB中的StoreResult - > Web客户端更新页面包含结果(AJAX)。

客户端和服务之间的通信使用关系数据库来传递消息。 java服务有一个单线程轮询器,它查找并处理来自客户端的任何消息/请求。系统有效,但我对自己的设计选择没有信心。

有没有人对此策略有任何意见?我已经读到使用数据库作为IPC反模式是不好的做法,或者至少是不合适的做法。但是,替代方案 - XMLRPC,命名管道 - 似乎涉及其他依赖项。

感谢您的光临。

4 个答案:

答案 0 :(得分:5)

如果是我,我需要PHP来从java服务中获取/使用数据,我会转储数据库。

让java服务w / HTTP侦听127.0.0.1,端口5544(或一些随机#)。让servlet / jsp接受RESTful请求,然后吐出JSON结果。因此,如果是搜索,则URL为:

h ttp://127.0.0.1:5544 / search_zip_code / 80203

结果将是简单的json:

{“city”:“Denver”,“state”:“Colorado”}

然后在PHP端执行curl请求 - 使用来自用户输入的参数构建URL,执行curl请求,获取数据并对其进行json_decode($ result_array = json_decode($ curl_result);)。< / p>

这很简单。这样,您可以轻松地测试任一组件(从命令行执行curl / wget来测试java服务,或者检查服务器端的access_logs以查看搜索参数和客户端的连接)。

对于PHP方面,使用curl_exec和json_decode(在PHP手册中搜索这些函数)。

这是我在java方面找到的随机链接:

Parsing JSON data with java servlet struts

这种方式可扩展(易于分离服务),模块化(易于测试任一组件),并且可以更快地将结果传回客户端。

答案 1 :(得分:1)

我将DB的以下参数视为IPC:

1)您需要存储您收到的所有(或一段时间)消息。

2)您需要高可靠性并且不想丢失任何消息。

3)DB两侧的性能差异很大。通过这种方式,左侧客户端可以生成大量消息,而右侧的许多客户端将处理它们。因此DB就像被动负载均衡器一样具有高可靠性。

您需要这些功能吗?我想不是。您不能将其用作负载均衡器,因为所有进程都在同一主机上。我认为您不需要存储所有Web请求。

在这种情况下,我会选择简单的套接字。

答案 2 :(得分:0)

这是一个黑客,但它显然适合你。 Here is a web site关于如何在PHP中使用DB表实现消息队列。

答案 3 :(得分:0)

如果您只需要PHP的消息传递,只需使用ActiveMQ - 就像UNIX IPC中的消息队列一样。 但是,数据库可能与UNIX IPC中已知的共享内存和信号量相当。 因此,使用ActiveMQ和数据库,您可以使用与UNIX IPC相同的功能,但如果一台服务器对您来说太小,则可以进行群集。