[英]Task-execution-ETA in AppEngine Push Queues given lack of server clock synchronization
如果將AppEngine推送隊列與TaskOptions.etaMillis(...)
選項一起添加,則可以將其安排為將來執行。 正如System.currentTimeMillis()
返回的那樣,此方法需要一個long
參數來指定執行任務的時間(以絕對毫秒為單位System.currentTimeMillis()
。
鑒於AppEngine無法保證服務器時鍾同步,並且時鍾可能會以HOURS的順序關閉! (請參閱“ Google I / O 2010-使用Google App Engine的數據管道”,網址為0:36:07 ),這怎么可靠?
讓我們考慮以下示例:
System.currentTimeMillis() + 10,000
安排任務 底層API是否以某種方式阻止了此操作? 如果沒有,那么任務ETA到底有什么用? 能否將ETA指定為相對時間而不是絕對時間才能使它起作用?
令人難過的是,實際上有一個名為TaskOptions.countdownMillis(...)
的函數確實期望一個相對時間,但是查看最終處理該值的源代碼 ,人們看到它只是被轉換為絕對時間。基於相同的高度不可靠的System.currentTimeMillis()
規范。
更糟糕的是:如果您未指定ETA或倒數計時,則此函數僅使用當前系統時間而不是0,因此,即使您希望立即執行的任務也可能會被擱置一個小時或更長時間!
這是一些重大錯誤還是我錯過了一些東西?
同樣,這同樣適用於“ 拉入隊列”中的“任務”租約,對嗎?
如果將倒計時設置為10,000毫秒,則任務通常會在10秒鍾左右運行,但有時任務可能會延遲幾分鍾。 它們用於最終用戶不等待的任務。
如果所有處理均由具有完美可用性的單個服務器處理,則相對時間將起作用。 取而代之的是,我們有許多服務器,每台服務器的可用性都不完美,因此,我們知道時鍾偏斜通常很小,因此添加了具有絕對時間的任務。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.