问题
我有购买服务,用户可以使用它来购买/租用游戏、媒体、电影等数字资产......当购买事件发生时,我创建一个作业并安排它在计算的过期日期运行以删除此类资产的密钥。
一切正常。但是,如果我可以将那些将在同一个议程数据库扫描中运行的作业分组到 1 个批处理作业中以删除多个键,那就更好了。
这将减少键和议程集合中的大量数据库读/写/删除操作,它还会在大多数情况下增加可用内存,因为它不是存储 100 多个作业以在扫描中运行,而是仅存储 1 个作业到删除 100 多个键。
研究
我在 Agenda repo 中找到的最接近的功能是 unique()。它允许用户查找和修改与 unique() 中定义的字段匹配的现有作业。如果它可以将新工作与现有工作结合起来,那将解决我的问题。
执行
在潜入并修改包之前,我想检查是否已经有人解决了我遇到的问题并有一些想法可以分享。
另一个不接触包的解决方案是创建一个内存字典,以使用以下策略为特定的数据库扫描累积作业:
dict = {}
//if key expires in 1597202228 then put to dict slot:
dict = {
1597300000: [jobA]
}
//another key expires in 1597202238 then put to the same slot:
dict = {
1597300000: [jobA,jobB]
}
//the latch condition to put job batch into agenda:
if dict_size == dict_allocated_memory then put the whole dict into db.
if a batch_size = batch_limit then put the batch into db and remove the batch in dict.
if the batch is going to expire in the next db scan then put the batch (it may be empty, has a few jobs...) into db and remove the batch in dict.