SQL表事件存储为Qt App中的队列

时间:2014-10-16 15:42:32

标签: c++ qt distributed cqrs event-sourcing

我只需要使用Qt课程就我的Qt应用程序提供一些建议。我可以接受QtNetwork和QSql模块作为解决方案,但不接受“第三方”工具,如RabbitMQ等。

我正在使用带有事件采购的CQRS的“Event Store As A Queue”(参见Greg Young第46页)。我有一个简单的SQL表,用于存储具有唯一顺序ID的事件。因此,可以跟踪“追逐过程”所使用的“事件存储指针”。

目标:我想运行多个进程来处理事件,“将它们从队列中弹出”,确保它们只被处理一次......

在这个阶段,我只通过数据库(mySQL,SQLite)进行进程间通信,并设置一个共享表,将TTL(生存时间)作为听觉节拍列表。 “TOP”过程充当工人。因此,如果它死了TTL超时,下一个接管。然后TOP工作人员清理出“陈旧过程”。这有一些延迟至少等于TTL,例如。 5s这不是最佳情况。

我现在想让其他流程也开展一些工作。我可以将“TOP”角色从Worker更改为Dispatcher,但之后我需要与其他进程进行通信以进行工作(例如,Process Events 100-200)。通过数据库进行调度在性能方面看起来不是一个好主意所以我可以通过QTcp **类发出事件ID信号......这不是一个真正的问题。但是,它会带来一些其他问题:当我的调度员去世时会发生什么?一个流程扮演工人和调度员是一个好习惯吗?故障转移?冗余?伸缩性?

我确信必须有一些简单的解决方案而不会让我失望。负载均衡器?同样的问题适用。负载均衡器只是一个调度员。似乎我需要通过TCP在进程之间保持心跳。会更快......在这个阶段实施类似RAFT协议的东西是一种矫枉过正!不确定是否适用其他分布式设计模式或协议。我有一个REST框架......也许是ATOM? PubSubHubHub和WebHooks?不喜欢WebSockets,因为我们需要持久化TCP连接...

思想,想法,建议欢迎!

1 个答案:

答案 0 :(得分:1)

您是否尝试在数据库之上实现排队机制值得吗?我看到你的系统无法承受丢失的消息,但是一旦你有TTL看起来你真的不需要它。

"目标:我想运行多个进程来处理事件,并且#34;从队列中弹出它们"确保他们只受到一次治疗。" - http://www.eaipatterns.com/CompetingConsumers.html这是一个简单的解决方案,你运行的每个都应该以这种方式使用它:   - 从"队列"获取消息,将其标记为已检索以供消费,并且可以仅在定义的时间段内处于这种状态。   - 消费。   - 更改队列中消息的状态并(重新)移动它。

让您的员工在不同的虚拟机中运行,并从实现此http://arnon.me/soa-patterns/service-watchdog/

的每个虚拟机中收集统计信息