控制azure WebJob函数调用

时间:2016-01-05 16:26:15

标签: sql-server multithreading azure azure-webjobs azure-webjobssdk

我有一个Azure连续Web作业,它有几种方法。第一种方法 CleanupDb 是[Singleton]并且每5分钟触发一次,第二种多线程方法 ProcessXML 使用队列触发。 ProcessXml将数据的批量副本从存储在blob存储中的xml中复制到数据库,但是当CleanupDb方法运行时,我想:

  1. 在CleanupDb的持续时间内暂停 ProcessXml 的队列触发器
  2. 等待 ProcessXml 的任何当前实例完成
  3. 对数据库执行更新
  4. 完成数据库清理后,重新启用对 ProcessXml 的调用。
  5. 我怎样才能做到这一点?我是否需要使用Semaphores或Mutex进行线程间通信?是否可以禁用QueueTrigger?最后我应该在批量复制操作上使用TabLock - 目标表有一个聚簇索引,但我没有注意到问题?

    Duration

1 个答案:

答案 0 :(得分:1)

一旦运行,就无法暂时禁用队列触发器。我还提到TimerTrigger默认是隐式的Singleton。它在幕后需要一个Singleton锁,以确保只有一个已调度函数的实例在扩展实例中运行。因此,您可能不需要额外的Singleton属性。

一种选择是在两个函数上使用单例,使用相同的锁定范围(例如[Singleton("xmlimport")])。这将确保功能不会同时运行 - 它们都需要相同的锁定。例如,当CleanupDB正在运行时,任何ProcessXML调用都将等待锁定,反之亦然。这样做的一个潜在缺点是您的队列函数现在也将被序列化 - 即使您的clean函数未运行,也只会一次处理一个队列消息。如果您希望队列中的吞吐量很高,您可能不希望这样。但是,如果进口操作不经常发生,那么它可能是您的选择。

如果您将WebJob扩展到多个实例,使用进程同步将无法工作,您再次需要像Singleton提供的某种分布式锁定。

另一个选择是确保您的数据库清理sproc可以同时运行,这样您就不必担心同步。不确定这是否适合您。例如,确保清理操作仅对旧数据进行操作,因此进行中的操作不会干扰等。