如何在MySQL上创建事件流

时间:2017-11-24 00:59:41

标签: mysql stream innodb

给出以下InnoDB表:

Formdata.append

考虑到有多个客户端同时将事件插入到此流中:我们可以使用哪种技术,以便多个侦听器/使用者可以以增量方式处理此事件流?

(编辑)I.E。我希望在此流中附加多个客户端,它们可以对新事件做出一次反应,并跟踪它们在流上的位置。

考虑:

  • 不使用MySQL来存储事件不是一种选择;
  • 不接受锁定整个表格;
  • 我想保持对一个事件的控制似乎/似乎不是消费者,这个表可能有多个消费者;
  • 可以创建新列;
  • 此表将增加到数亿个事件;

1 个答案:

答案 0 :(得分:1)

"不要排队,就这样做。"我发现数据库构成了一个糟糕的排队机制。如果'工人'线程不需要花很长时间来执行任务,然后让队列机只执行任务;这消除了队列的开销,从而可能使系统更快,更好地扩展。

"数以亿计的活动" - 几乎所有人都被处理了#34;?这表明你有两个表 - 一个用于处理事件,一个用于等待处理的事件。后者很少会有几十行?在这种情况下,处理将更好。

有两个额外的列:哪个工人拥有该流程,以及当工人抓住它时。时间是这样的,你可以处理一个工人抓住任务然后死亡的情况(是,最终会发生) - 从而使任务成为孤儿。由于单独的工作可以收获'这些孤儿。

单个SQL UPDATE可以抓取表中的一行。在事务中单独执行此操作,在流程中的任何事务中。同样'发布'在自己的交易中的任务。

抓取是这样的(使用autocommit=ON):

UPDATE ToDo SET who = $me, when = NOW()
    WHERE who IS NULL
    LIMIT 1;   -- grab one
SELECT ... FROM ToDo WHERE who = $me;  -- get details on the task

'发布'可能涉及两个表,如下所示:

BEGIN;
$stuff = SELECT ... FROM ToDo WHERE who = $me;
DELETE FROM ToDo WHERE who = $me;
INSERT ... INTO History ... VALUES (most of stuff from $stuff);
COMMIT;

在抓取和释放之间,只要你需要执行“任务”就可以了。你不会被InnoDB超时等绊倒。

如果您想提供有关队列和任务的更多详细信息,我可能会进一步改进。

我所描述的应该处理任何数量的插入器,任意数量的工作人员以及持续任何时间长度的任务。

对于浏览事件列表,

AUTO_INCREMENT 不可靠。 INSERT是多个步骤:

  1. 开始交易
  2. 获取下一个auto_incr id
  3. 执行插入
  4. COMMIT - 现在只有其他人看到新ID
  5. 是可能的(特别是在复制中),因为COMMIT是"乱序"相对于auto_incr。