我有一个azure function
,我想在parallel
中处理多个消息,但是以Person Id
的方式执行具有相同singleton
的消息。
方案1:
我有n
条消息,每条都有相同的Person Id
。每条消息都需要按照它们到达的顺序执行,但以singleton
的方式执行。
方案2:
我有n
条消息。其中一些具有Person Id:1
。其中一些具有Person Id:2
。可以使用parallel
执行具有不同Person ID的消息,但是具有相同Person Id
的消息需要按照它们到达的顺序并以singleton
的方式执行。
我该如何实现?
编辑:
我的应用程序在Consumption Plan
上运行,因此,我无法预测应用程序的扩展方式和时间。天蓝色函数最初会在所有分区上获得租约。似乎当应用程序未缩放时,azure函数最初会在所有分区上获得租约。 @juunas在评论中建议的解决方案让我担心,我的应用程序将永远无法扩展,并且可能最终会通过azure函数的单个实例按顺序运行批处理,因为我的函数将无法始终接收数百万个数据点。在Consumption Plan
下进行缩放的试探法是未知的。
也许,以某种方式将事件中心与有序功能保证和持久功能并行模式结合在一起?
编辑2:
考虑两个功能:Appender
功能:通过将“人员ID”和任何其他必需属性一起添加来维护cache
中的有序列表。不一定是天蓝色的功能。Processor
功能:使用持久功能singleton pattern(也可以在cache
中存储有关正在处理的个人ID的信息)
流:
附加后,Appender
将一条消息发送到queue
,消息中仅包含Person Id
。如documentation中所述,Person Id
将用作instance id
。Processor
(如果该函数的实例尚不存在)将开始在缓存中执行特定的Person Id
消息。
如果Processor
的实例已经存在,则该消息将被忽略。
问题:Processor
完全清空了缓存的Person Id
有序消息,但并行Appender
在Processor
退出之前追加另一条消息的情况,因此不会执行新消息。现在,缓存将包含1条未处理的消息,并且直到Appender
附加同一Person Id
的另一条消息之前,不会调用azure函数来对其进行处理。
也许我应该以某种方式使用Durable Function
Monitor
模式?
编辑3:
我考虑的另一种方法是使用Monitor模式。如果正在执行带有特定instance id
的函数,则消息将间隔等待,而不是被忽略。队列消息本身只是Person Id
,其其他属性按cache
的顺序排列。这将确保按照正确的顺序执行每条消息(通过使用cache
中维护的列表)。但是,将监视器方法与队列一起使用时,可能会出现单例example中提到的以下问题:
该样本中存在潜在的种族条件。如果两个实例
的HttpStartSingle并发执行,两个函数调用将
报告成功,但实际上只有一个业务流程实例
开始。根据您的要求,这可能会有不利的一面
效果。因此,重要的是要确保没有两个
请求可以同时执行此触发函数。
我考虑的另一种方法是使用Monitor模式,通过将Edit 2 Appender
方法与使用实例ID的单例模式结合使用,每个功能仅执行一条消息。
最佳答案
将工作项放入数据库中。每次添加新工作项时,也会排队一次Azure函数调用。
然后,该Azure功能将依次处理该人员的所有排队的工作项。它将查询数据库以获取该人员的所有工作,而不仅仅是任何工作。
必须有一种机制可以确保特定人员在任何时间点仅运行一个Azure函数调用。您可以通过实现某种形式的锁来做到这一点。例如,您可以将当前正在处理人员1234的信息写入数据库表。如果使用人员1234调用了Azure函数,并且注意到该人员已经在处理中,则它将简单地返回并且不执行任何操作。
我刚才提出的方案在竞争条件等方面有一些漏洞。但是那些可以解决。我希望这个想法能使您开始解决问题。
我想这里的元错误是要坚持用函数,队列或其他Azure原语解决问题。普通数据库(例如Azure表或SQL)可以完成这项工作。
关于c# - 如何确保具有相同Person ID的消息以单例方式执行,而不同消息则以并行方式执行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54483219/