【发布时间】:2011-03-21 23:36:26
【问题描述】:
我正在开发一个经常需要运行计算密集型查询的 Web 应用程序,其结果存储在单独的表中。使用 MySQL,此查询大约需要 500 毫秒(相信我,尽可能优化)。为了消除这个瓶颈,我创建了一个 Java 程序,将相关的 DB 数据加载到内存中并自行执行查询;大约需要 8ms(我有点自豪)。我想使用这个 Java 程序来获取结果,如果它失败或不可用,则故障转移到让 PHP 运行 MySQL 查询。
由于将数据加载到 Java 应用程序需要一些时间,因此它将加载一次并作为后台进程继续运行。 现在的问题是如何通过 PHP 与这个 Java 应用程序通信?
记住:
- 多个 PHP 实例可能需要同时与此 Java 进程通信。
- 如果找不到 Java 实例(例如:由于某种原因崩溃),PHP 应该使用较旧和较慢的 MySQL 方法来进行。
- 可以使用中间进程,例如 Memcache。
- 理想情况下,解决方案能够承受竞争条件。
- 我最好不要使用 MySQL 作为中介。
我打算使用 Memcache,其中 PHP 将写入一个已知键并轮询,直到该键更改为“已完成”,同时 Java 将轮询该键,一旦找到执行工作并将其设置为“已完成” .但是,这行不通有两个原因。首先,PHP 和 Java 都使用序列化对象读取/写入 Memcache,没有办法改变它,我不希望 Java 反序列化 PHP 对象,反之亦然——这太混乱了。其次,这不符合 ACID ——如果建立了一个队列,就会出现竞争条件。
目前,我坚持轮询 MySQL“选择”以查看作业是否已退出队列,这远非最佳解决方案,因为轮询时间需要更慢,因此 MySQL 无法获得ping 太频繁。我需要更好的解决方案!
谢谢。
编辑:呵呵。看起来我将在 Java 中使用某种我不熟悉的 SocketServer。一个例子可能会有所帮助:)
【问题讨论】:
-
这看起来很头疼。
标签: java php architecture memcached