2

我有一个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:

考虑两个函数:

  1. Appendercache功能:通过附加人员 ID 以及任何其他必需属性来维护有序列表。不一定是天蓝色的功能。
  2. Processor功能:使用持久函数单例模式(也可以存储正在处理的Person Id信息cache

流动:

  1. Appender,在附加之后,向 a 发送一条消息,queue其中只包含Person Id消息中的 。将Person Id按照文档instance id中的说明使用。
  2. Processor,如果该函数的实例尚不存在,将开始执行Person Id缓存中的特定消息。
  3. 如果 的实例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 的单例模式相结合,每个函数只执行一条消息。

4

1 回答 1

0

将工作项放入数据库。每次添加新工作项时,也会将 Azure 函数调用排入队列。

然后,该 Azure 函数将按顺序处理该人的所有排队工作项。它将查询数据库以获取该人的所有工作,而不仅仅是任何工作。

必须有一种机制来确保在任何时间点为特定人员只运行一个 Azure 函数调用。您可以通过实现某种形式的锁定来做到这一点。例如,您可以将人员 1234 当前正在处理的信息写入数据库表。如果使用人员 1234 调用 Azure 函数并且它注意到此人已被处理,它将简单地返回并且不执行任何操作。

我刚刚提出的这个方案有一些漏洞,比如竞态条件。但这些是可以修复的。我希望这个想法能让你开始解决问题。

我猜这里的元错误是坚持用函数、队列或其他 Azure 原语来解决问题。一个普通的数据库(例如 Azure 表或 SQL)可以完成这项工作。

于 2019-02-06T14:57:17.270 回答