Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/237.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 数据库作为IPC反模式_Java_Php_Ipc_Anti Patterns - Fatal编程技术网

Java 数据库作为IPC反模式

Java 数据库作为IPC反模式,java,php,ipc,anti-patterns,Java,Php,Ipc,Anti Patterns,我编写了一个分层web应用程序,它由一个与java服务交互的富web客户端(PHP)组成。web客户端托管在apache服务器上,java服务运行在同一台物理机器上(重申:整个应用程序、客户端和服务都运行在同一台物理机器上) 用户请求-->DB RequestHandler-->数据库中的StoreResult-->Web客户端使用结果更新页面(AJAX) 客户机和服务之间的通信使用关系数据库传递消息。java服务有一个单线程轮询器,它查找并处理来自客户端的任何消息/请求。该系统工作正常,但我对

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

用户请求-->DB RequestHandler-->数据库中的StoreResult-->Web客户端使用结果更新页面(AJAX)

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

有人对这一策略有什么评论吗?我曾读到,使用数据库作为IPC反模式是一种糟糕的做法,或者至少是一种不合适的做法。然而,备选方案——XMLRPC,命名管道——似乎还涉及其他依赖项


谢谢查看。

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

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

2) 您需要高可靠性,并且不希望丢失任何消息

3) DB对侧的性能非常不同。这样,左侧客户端可以生成大量消息,而右侧的许多客户端将处理这些消息。因此,DB就像一个高可靠性的被动负载平衡器

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


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

这是一个黑客攻击,但它显然适合您。关于如何在PHP中使用DB表实现消息队列。

如果您只需要PHP的消息传递,只需使用ActiveMQ-就像UNIX IPC中的消息队列一样。 然而,数据库可能相当于UNIX IPC中已知的共享内存和信号量。
因此,有了ActiveMQ和数据库,您就可以用UNIX IPC做同样的事情,但如果一台服务器对您来说太少,它可以集群化。

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

让java服务w/HTTP在127.0.0.1、端口5544(或一些随机的#)上侦听。让servlet/jsp接收RESTful请求,并输出JSON结果。因此,如果是搜索,URL将是:

http://127.0.0.1:5544/search_zip_code/80203

结果将是简单的json:

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

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

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

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

下面是我为java端找到的一个随机链接:


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

您将数据库用作消息队列。您应该研究的是:它是否是一个好的消息队列?可靠性(在任何情况下都不会丢失一条消息)和吞吐量如何?数据库并不是真正用于队列/排队的。它们用于队列软件的持久性,比如。但有些数据库提供了……一些其他的东西:你研究过Quercus吗?@mario对我来说,Quercus的整个概念似乎是邪恶的:你为什么要用另一种解释语言来解释和解释语言?(我知道,java不是很好,但你得到了答案)你考虑过吗?有效点。因此,对于套接字,客户端需要打开一个套接字并将其消息发送给java服务。因此,我需要编写代码来管理服务器套接字。这有多高效?可靠性呢?服务器套接字崩溃等等。另外,为每个用户请求打开一个客户端套接字会有多贵?谢谢你的建议。你真的需要一条信息都不要漏掉吗?对于web应用程序,不发送某些请求是正常的。用户看到错误并重试一次。所以,一般来说,你不需要网络应用程序的高可靠性。你真的需要不丢失一条信息吗?对于web应用程序,不发送某些请求是正常的。用户看到错误并重试一次。因此,一般来说,web应用程序不需要高可靠性。当您连接到DB时,您也使用套接字,但使用更高级别的协议。因此,您可以使用原始套接字实现更高的效率。如果您不想重新发明轮子,可以使用HTTP请求从一个服务到另一个服务。即使使用HTTP,也会比使用DB使用更少的CPU和内存。要点-了解您真正需要的流行功能并选择适当的协议(或可能是DB),我同意!我们最终做了一些非常相似的事情。谢谢,对于延迟接受此答案,我深表歉意。链接页面已移动,很可能在此处: