2010-09-28 73 views
3

我已经编写了一个分层的Web应用程序,它由一个与Java服务交互的富Web客户端(PHP)组成。 Web客户端托管在apache服务器上,并且java服务在同一台物理机器上运行(重申:整个应用程序,客户端和服务在同一台物理机器上运行)。作为IPC反模式的数据库

用户请求 - > DB < - 轮询 - > RequestHandler - > StoreResult在数据库 - > Web客户端更新页面的结果(AJAX)。

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

有没有人对此策略有任何意见?我读过使用数据库作为IPC反模式是不好的做法,或者至少是不适当的做法。但是,替代品 - XMLRPC(命名管道)似乎涉及其他依赖关系。

感谢您的期待。

+1

您正在使用数据库作为消息队列。你应该研究的是:它是否构成一个好的消息队列?如何可靠性(不要错过任何情况下的单一信息)和吞吐量? – jrharshath 2010-09-28 18:45:06

+2

数据库并非真正用于队列/排队。它们用于排队软件的持久性,如[ActiveMQ](http://activemq.apache.org/)。但有些数据库提供[本机队列支持(SQL Server)](http://www.developer.com/db/article.php/3640771/Getting-Started-with-SQL-Server-Service-Broker.htm).. 。 – 2010-09-28 18:47:23

+0

别的东西:你看过栎属吗? – mario 2010-09-28 19:16:15

回答

4

如果是我,我需要PHP来抓取/使用来自java服务的数据,我会转储数据库。

有127.0.0.1,端口5544(或一些随机#)HTTP监听java服务。让servlet/jsp获取RESTful请求,并吐出JSON结果。因此,如果它的搜索,网址将是:

h ttp://127.0.0。1:5544/search_zip_code/80203

和结果将是简单的JSON:

{ “城市”: “丹佛”, “状态”: “科罗拉多”}

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

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

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

这是我发现的Java端随机链接:

Parsing JSON data with java servlet struts

这样将可扩展性(其易于分离的服务),模块化(很容易测试任一部件),以及大量更快地将结果交付给客户。

+0

我同意!我们最终做了一些非常相似的事情。谢谢,我对接受这个答案的延误表示歉意。 – 2011-03-15 19:32:43

1

我看到DB以下参数作为IPC:

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

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

3)DB对面的性能是非常不同的。通过这种方式,客户端可以生成大量的消息,右侧的许多客户端会处理它们。所以DB就像被动式负载均衡器一样具有很高的可靠性。

您是否需要这些功能?我想不是。您不能将其用作负载平衡器,因为所有进程都位于同一主机上。我认为你不需要存储所有的网络请求。

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

+0

有效的点数。因此,对于套接字客户端需要打开一个套接字并将其消息发送给java服务。因此,我需要编写代码来管理服务器套接字。这有多高效?什么样的可靠性 - 服务器套接字崩溃等等。另外,为每个用户请求打开一个客户端套接字是多么昂贵?感谢您的建议。 – 2010-09-28 19:28:12

+0

你真的不需要失去一条消息吗?对于网络应用程序,通常不提供某些请求。用户看到一个错误,并再次尝试一次。所以一般来说,你不需要Web应用程序的高可靠性。 – Donz 2010-09-28 19:44:35

+0

你真的不需要失去一条消息吗?对于网络应用程序,通常不提供某些请求。用户看到一个错误,并再次尝试一次。所以一般来说,你不需要Web应用程序的高可靠性。连接到数据库时,您也可以使用套接字,但使用更高级别的协议。所以你可以用原始插座达到更高的效率。如果你不想重新发明轮子,你可以使用从一个服务到另一个服务的HTTP请求。即使使用HTTP,您也会使用较少的CPU和使用数据库的内存。要点 - 了解您真正需要的主要功能,并选择适当的协议(或可能是DB) – Donz 2010-09-28 19:50:38

0

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

0

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