Azure 角色间同步

发布于 2024-12-02 10:44:11 字数 903 浏览 1 评论 0原文

我想知道同步运行相同角色的多个 azure 实例的最佳实践。 更准确地说,我想防止多个工作角色在同一工作单元上工作。

Azure 队列似乎对这个问题没有帮助。 一种选择是使用带有锁和存储过程的 sql 表;但是在Azure中使用sql同步似乎有点尴尬。

有什么想法吗?

编辑,我的详细(但简化的问题)如下:

  • n 个目标。
  • 必须以指定的时间间隔(例如 30 秒 - 但每个目标都不同)对每个目标完成一个工作单元。
  • 我有 m 个工作人员(托管在 h 个实例中)。
  • 处理一个工作单元可能需要 10 秒到 1 小时之间的时间。

我的想法是,我有一个调度程序,它将工作单元放入 Azure 队列中,每个 m 个工作人员都会读取这些工作单元并进行处理。

问题:

  • worker1 开始在 unit1 上工作(与 target1 相关) - 这将需要很长时间,比如 10 分
  • 30 秒通过
  • 调度程序为 target1 放置另一个工作单元,例如 unit13
  • worker2 开始在 unit13 上工作,针对相同的 目标1- 不好

我有一些想法,但它们看起来不够模糊,所以我很想知道您会针对这个问题应用什么解决方案。

I was wondering about the best practices in synchronizing multiple azure instances that run the same role.
More precisely, I want to prevent several worker roles to work on the same work-unit.

Azure queues do not seem to help on this matter.
One option is to use an sql table with locks and stored procedures; but using sql synchronization in Azure seems a bit awkward.

Any ideas?

Edit, my detailed(but simplified problem) is as follows:

  • There are n targets.
  • A unit of work must be done on each target at a specified interval (say 30 seconds - but it is different for each target).
  • I have m workers (hosted in h instances).
  • Processing a unit of work could take anything between 10 seconds and 1 hour.

The idea is that I have a scheduler that puts units of work in an Azure queue, and each of the m workers will read these and process them.

The problem:

  • worker1 starts working on unit1 (which is regarding target1) - this one will take long, say 10 minutes
  • 30 seconds pass
  • the scheduler puts another unit of work for target1, say unit13
  • worker2 starts working on unit13, against the same target1 - not good

I have some ideas, but they don't seem cloudy enough, so I am interested to see what solutions would you apply for this problem.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

深居我梦 2024-12-09 10:44:11

dunnry 非常准确:队列非常适合防止多个实例处理同一工作项。当您调用 GetMessage 时,您检索到的消息现在在您指定的时间跨度(默认值:30 秒)内不可见。在该时间跨度内,没有其他读取器可以检索该队列消息。

话虽如此:您需要确保您的处理是幂等的。如果您的处理时间超过了不可见时间跨度,该消息将再次变得可见。此时,原始读者无法删除该消息,并且其他读者可以读取该消息(使其再次不可见)。在这种情况下,您可能会重新处理同一条消息。作为一般规则,您需要仔细设置超时窗口以避免这种情况。

注意:每个 CloudQueueMessage 都有一个 DequeueCount 属性,因此您可以确定该消息是否已被多次查看(因此您还可以处理有害消息)。

dunnry is spot-on: queues work great for preventing multiple instances from working on the same work item. When you call GetMessage, the message you retrieve is now invisible for the timespan you specify (default: 30 seconds). In that timespan, no other reader can retrieve this queue message.

Having said that: You need to ensure your processing is idempotent. In the case where your processing takes longer than the invisibility timespan, the message becomes visible again. At this point, the original reader cannot delete the message, and someo other reader can read the message (making it once again invisible). In this case, it's possible that you re-process the same message. You'll need to carefully set your timeout window to avoid this as a general rule.

Note: Each CloudQueueMessage has aDequeueCount property, so you can determine if the message has been seen more than once (and so you can also deal with poison messages).

橘亓 2024-12-09 10:44:11

CloudFX 有一个 PrimaryInstanceManager 类,可用于其中一些场景。

CloudFX has a PrimaryInstanceManager class that can be used for some of these scenarios.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文