2017-06-14 93 views
0

我的SQL Server 2014 SourceDBLogDB對兩個數據庫。在SourceDB上,Service Broker;並在服務器上,Service Broker External Activator服務被激活。的Service Broker外部激活響應多久

在SOURCEDB我有TargetQueue其中一個表的(產品)的INSERT觸發器將在TargetQueue變化和TargetQueue具有輕推我的外部EXE客戶端事件通知。在EXE內部客戶端,我最終通過WAITFOR(RECEIVE TOP (1))..將數據出隊並將它們直接記錄到LogDB。因此,當我啓動SBEA服務並首次插入表中某個記錄(刪除所有記錄後)時,TargetQueue立即填充,但插入到SourceDB的時間間隔直到插入到LogDB爲止約爲3-6秒,事件通知的時間消耗在這裏我猜,我不確定。對於此後的進一步插入,間隔變爲100ms,如下所示。

首先

First

進一步

Further

  1. 爲什麼是第一個插入花費太長時間,爲什麼刪除表中的所有記錄後,就變成再走多久?爲什麼更多的人比第一個人短?
  2. 我可以減少10ms以下的時間間隔,因爲我可以在10ms內實現與SQLCLR幾乎相同的結構,最快的響應對我的應用程序也至關重要? (兩個結構在同一個SQL Server實例本地工作)
+0

Service Broker的本質上是異步的。如果你想使用它作爲一個技術,你應該在設計你的應用程序時考慮到這一點,也就是說,任何產生的消息最終都會被你的進程佔用,但是你所描述的內容聽起來很像你期望的接近隊列中的同步行爲。最終會失望 –

+0

@BenThul我使用的是Service Broker,因爲它是異步的,因爲我的服務器會遇到很高的請求頻率,爲了不中斷這些請求的處理或停留在其中之一,我已經使用Service Broker而不是任何同步結構(因爲我最近在這裏給出了很好的建議)。但如果真的如此,我真的對這個表現感到失望,所以這就是我所要求的。 – ibubi

回答

1

您可以通過放棄外部激活器和事件通知來簡化流程。相反,讓你的程序持續運行WAITFOR(直接在目標隊列接收一個循環

下面是一個樣本,讓你開始:。https://code.msdn.microsoft.com/Service-Broker-Message-e81c4316

+0

這是否意味着我不應該依賴基於事件的結構來快速響應?並且,輪詢Waitfor(..'語句對於sql服務器代價高昂? – ibubi

+0

事件通知,外部激活器本身以及它必須啓動外部進程的事實都會增加時間,並且使用WAITFOR輪詢(接收並不昂貴,只要你使用一個合理的超時(至少幾秒鐘)。 –

+0

謝謝大衛,我會給一個嘗試這種並取回的結果。 – ibubi