我有一个azure function
我想在其中处理多条消息的消息,parallel
但是以相同的方式Person Id
执行消息singleton
。
场景 1:
我有n
许多消息,每条消息都具有相同的Person Id
. 每条消息都需要按照它们到达的顺序执行,但要以某种singleton
方式执行。
场景 2:
我有n
很多消息。其中一些有Person Id:1
。其中一些有Person Id:2
。可以执行具有不同 Person Id 的parallel
消息,但具有相同的消息Person Id
需要按照它们到达的顺序和singleton
方式执行。
我怎样才能做到这一点?
编辑:
我的应用程序正在运行Consumption Plan
,因此,我无法预测我的应用程序将如何以及何时扩展。azure 函数最初会在所有分区上获取租约。看来,当应用程序未扩展时,Azure 函数最初会在所有分区上获得租约。@juunas 在评论中建议的解决方案让我担心,我的应用程序永远不会扩展,并且可能最终通过一个 azure 函数实例顺序运行批处理,因为我的函数不会持续接收数百万个数据点。下缩放的启发式方法Consumption Plan
是未知的。
也许,以某种方式将有序保证中的事件中心与持久功能并行模式结合起来?
编辑2:
考虑两个函数:
Appender
cache
功能:通过附加人员 ID 以及任何其他必需属性来维护有序列表。不一定是天蓝色的功能。Processor
功能:使用持久函数单例模式(也可以存储正在处理的Person Id信息cache
)
流动:
Appender
,在附加之后,向 a 发送一条消息,queue
其中只包含Person Id
消息中的 。将Person Id
按照文档instance id
中的说明使用。Processor
,如果该函数的实例尚不存在,将开始执行Person Id
缓存中的特定消息。- 如果 的实例
Processor
已经存在,则该消息将被忽略。
问题:
一种场景,其中Processor
已完全清空缓存的Person Id
有序消息,但在退出之前并行Appender
附加另一条消息,Processor
因此不执行新消息。现在,缓存将包含 1 条未处理的消息,并且不会调用 azure 函数来处理它,直到Appender
附加另一条相同的消息Person Id
。
也许,我应该Durable Function
Monitor
以某种方式使用模式?
编辑 3:
我考虑的另一种方法是使用 Monitor 模式。instance id
如果正在执行具有特定功能的函数,则不会忽略消息,而是会间隔等待。队列消息本身将Person Id
与其他属性一起按顺序排列在cache
. 这将确保每条消息都以正确的顺序执行(通过使用 中维护的列表cache
)。但是,当将监视器方法与队列一起使用时,可能会出现单例示例中提到的以下问题:
此示例中存在潜在的竞争条件。如果 HttpStartSingle 的两个实例同时执行,则两个函数调用都会报告成功,但实际上只有一个编排实例会启动。根据您的要求,这可能会产生不良的副作用。因此,重要的是要确保没有两个请求可以同时执行此触发函数。
我考虑的另一种方法是使用 Monitor 模式,通过将Edit 2 Appender
方法与使用实例 id 的单例模式相结合,每个函数只执行一条消息。