我正在构建一个将在多个节点上运行的OO
PHP应用程序,并且本质上将是相对无状态的,我需要实现正确的发布者 – 订阅者(
http://en.wikipedia.org/wiki/Observer_pattern/
http://sourcemaking.com/design_patterns/Observer/php)样式事件.
我的问题是,我该如何处理事件?
在我的应用程序中,我们使用的是Cassandra,Redis,Mongo和RabbitMQ等技术.
我知道PHP有一个事件EXTENSION可用,但从我可以告诉它坚持状态 – 或者如果利用memcached之类的东西它可以在该节点内使用…但我的应用程序将分布在多个节点上.
那么让我们看一个例子:
在节点1上,更新度量(度量标准ID 37),并且需要更新订阅该度量的任何内容.这会在更新时发布更改和更改.
我有一些订阅更新的度量标准ID 37,例如度量标准38,可能需要在度量标准37的值更改时重新计算.
度量标准38当前已实例化并在进程ID 1011中的节点2上使用…度量标准37如何告知节点2上的度量标准38(在这种情况下为进程ID 1011)以运行预订函数?
Metric 39订阅Metric 38正在更新,但未在任何地方实例化…当Metric 38完成更新时,Metric 39如何更新?
我正在考虑使用RabbitMQ作为我的事件队列管理器,并且在每个节点上都有一个守护进程样式的“事件使用者”应用程序,它读取事件队列中的事件(为了负载平衡/分配工作).
然后消费者看到“Metric:38:Updated”它会检查像Redis那样订阅“Metric:38:Updated”的内容并获取值(“What:Function:Values”)并执行类似call_user_func_array(array($what)的操作,$函数),$值); ….但这似乎可能会导致开销和一定程度的同步问题…
我正在使用Doctrine MongoDB ODM来保存我的对象……为了处理同步问题我想到了这样的事情:
对象可以有版本号…(版本= 1.0)
并且redis可用于维护对象的最新版本的快速引用(ObjectVersion:ObjectType:ObjectId)= 1.1
当在标记为@critical的对象属性上调用getter(像isDeleted,货币余额等)时,它可以检查实例的版本ID是否等于redis中的版本#,如果需要则从mongo更新其值至…
因为我对网络开发(从c#转移)和无状态,并且分发…相当新.我认为向社区询问是否有人有更好的建议是个好主意?