给出以下InnoDB表:
Formdata.append
考虑到有多个客户端同时将事件插入到此流中:我们可以使用哪种技术,以便多个侦听器/使用者可以以增量方式处理此事件流?
(编辑)I.E。我希望在此流中附加多个客户端,它们可以对新事件做出一次反应,并跟踪它们在流上的位置。
考虑:
答案 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
是多个步骤:
是可能的(特别是在复制中),因为COMMIT是"乱序"相对于auto_incr。