我有多个工作在某个键上。这些作业是异步运行的,并被写入一些后写式缓存中。从概念上讲,它是这样的:
+-----+-----------+----------+----------+----------------+
| key | job1 | job2 | job3 | resolution |
+-----+-----------+----------+----------+----------------+
| 123 | job1_res | job2_res | job3_res | resolution_val |
+-----+-----------+----------+----------+----------------+
关键概念是我事先不知道有多少工作正在运行。相反,当需要写入记录时,我们添加“分辨率”(基于我们已经获得的当前工作结果),并将所有值写入数据库(如果有关系,则为MongoDB)
我还有一个load()
函数,该函数在发生高速缓存丢失时运行。它的作用是从数据库中获取记录,或者在找不到记录的情况下创建一个新的(空的)记录。
现在,有一个时间窗口,其中记录不在缓存中也不在数据库中。在那个时候,一个“慢工作者”可能会写出它的结果,不幸的是load()
函数会创建一个新记录。
从缓存中撤离时,记录将如下所示:
+-----+----------+-------------------------------+
| key | job4 | resolution |
+-----+----------+-------------------------------+
| 123 | job4_val | resolution_based_only_on_job4 |
+-----+----------+-------------------------------+
我可以想到两种方法来控制此问题:
当前解决方案的问题:
最自然的解决方案是什么?
为了保证所有工作结果的分辨率,我是否必须实施解决方案2?
编辑:
从理论上讲,我认为即使实施了解决方案2,也不能保证解决方案将基于所有工作结果。
EDIT2:
如果后写机制保证操作顺序,则解决方案2可以。这可以通过将回写限制为一个线程来实现。