我有一个新的持久功能来替换长时间运行的 webjob,它运行良好并且比以前的 webjob 更快,但是我遇到了并行性问题。
我知道所有活动都进入一个中心工作项 Q,这意味着项目按顺序处理,我遇到的问题是,如果用户 A 的积压工作中有 10 个项目并且用户 B 提交了一些东西,那么用户 B 必须等待直到用户 A 的所有数据处理完毕。
使用当前的 webjobs,我们可以自动缩放,一个新的 webjob 将为用户 B 获取数据并与现有处理并行处理。
我是否认为唯一的方法是发布我的功能的 2 个副本,每个用户/客户端一个,以确保一个用户不受另一个用户积压数据的影响?
我尝试将事物分块到工作项 Q 上,因此没有单个任务在 Q 上放置超过 X 个项目,因此理论上会有一些资源共享,但这只会减慢速度,因为工作项 Q 上的内容更少,所以由于工作项 Q 的体积较小,消耗计划自动缩放的扩展非常缓慢。
更新
我应该更清楚为什么我会看到这个问题,大约。Durable Function 流程如下:
- 将文件拆分为页面
- 扇出在每个页面的 Q 上放置一个活动
- 扇入
- 扇出为每个页面在 Q 上放置另一个活动(需要先前扇出的数据才能运行)
- 扇入
- 在单个事务中将页面信息插入数据库
- 将文件标记为在数据库中处理
所以用户 A 加载文件 1 有 1000 页,然后用户 B 加载文件有 100 页。
虽然我很欣赏它并行处理活动 Q,但它仍然按顺序从 Q 中拉出东西(我假设)所以如果用户 B 的文件启动时用户 A 的文件 Q 上有 1000 个项目,那么最初的 100 个页面活动就会得到在 1000 之后执行活动 Q,因此被他们“阻止”。然后,当 100 页初始活动完成时,很有可能下一次对 1000 页文档的扇出将再次向活动 Q 添加更多项目,从而进一步阻止 100 页文档的进度。
我的问题是用户 A 和 B 可能是 2 个不同的客户,他们不希望他们的工作被另一个客户的处理所阻止,因此我对有重复的持久功能实例和在多个实例之间代理消息的评论
这是否更有意义?