我有一个Azure连续Web作业,它有几种方法。第一种方法 CleanupDb 是[Singleton]并且每5分钟触发一次,第二种多线程方法 ProcessXML 使用队列触发。 ProcessXml将数据的批量副本从存储在blob存储中的xml中复制到数据库,但是当CleanupDb方法运行时,我想:
我怎样才能做到这一点?我是否需要使用Semaphores或Mutex进行线程间通信?是否可以禁用QueueTrigger?最后我应该在批量复制操作上使用TabLock - 目标表有一个聚簇索引,但我没有注意到问题?
Duration
答案 0 :(得分:1)
一旦运行,就无法暂时禁用队列触发器。我还提到TimerTrigger默认是隐式的Singleton。它在幕后需要一个Singleton锁,以确保只有一个已调度函数的实例在扩展实例中运行。因此,您可能不需要额外的Singleton属性。
一种选择是在两个函数上使用单例,使用相同的锁定范围(例如[Singleton("xmlimport")]
)。这将确保功能不会同时运行 - 它们都需要相同的锁定。例如,当CleanupDB
正在运行时,任何ProcessXML
调用都将等待锁定,反之亦然。这样做的一个潜在缺点是您的队列函数现在也将被序列化 - 即使您的clean函数未运行,也只会一次处理一个队列消息。如果您希望队列中的吞吐量很高,您可能不希望这样。但是,如果进口操作不经常发生,那么它可能是您的选择。
如果您将WebJob扩展到多个实例,使用进程同步将无法工作,您再次需要像Singleton提供的某种分布式锁定。
另一个选择是确保您的数据库清理sproc可以同时运行,这样您就不必担心同步。不确定这是否适合您。例如,确保清理操作仅对旧数据进行操作,因此进行中的操作不会干扰等。