【问题标题】:SQL table event store as a queue in Qt AppSQL 表事件存储作为 Qt App 中的队列
【发布时间】:2014-12-12 01:34:19
【问题描述】:

我需要一些关于仅使用 Qt 类的 Qt 应用程序的建议。我可以接受 QtNetwork 和 QSql 模块作为解决方案,但不能接受 RabbitMQ 等“第三方”工具。

我将“事件存储作为队列”(参见Greg Young 第 46 页)与带有事件源的 CQRS 一起使用。我有一个简单的 SQL 表,用于存储具有唯一顺序 ID 的事件。因此,可以跟踪“跟踪进程”要使用的“事件存储指针”。

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

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

我现在想让其他进程也承担一些工作。我可以将“TOP”角色从 Worker 更改为 Dispatcher,但随后我需要与其他进程进行通信才能提供工作(例如 Process Events 100-200)。通过数据库进行调度在性能方面看起来不是一个好主意,因此我可以通过 QTcp** 类发出事件 ID 信号……这不是一个真正的问题。但是,随之而来的还有其他一些问题:当我的调度员死后会发生什么?一个进程扮演 Worker 和 Dispatcher 是一种好习惯吗?故障转移?冗余?可扩展性?

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

欢迎提出想法、想法、建议!

【问题讨论】:

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


    【解决方案1】:

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

    “目标:我想运行多个进程来处理事件,就像“将它们从队列中弹出”一样,确保它们只被处理一次。” - http://www.eaipatterns.com/CompetingConsumers.html 这是简单的解决方案,您运行的每个工作都应该以这种方式使用它: - 从“队列”获取消息,将其标记为已检索以供消费,并且只能在定义的时间段内处于这种状态。 - 消耗。 - 更改队列中消息的状态并(重新)移动它。

    让您的工作人员在不同的虚拟机中运行,并从每个实施此http://arnon.me/soa-patterns/service-watchdog/ 的人那里收集统计信息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多