2015-03-02 24 views
2

我通過實例和Servlet線程收到高但可變量的HTTP遙測請求。我想在500條記錄的塊中插入所有BigQuery,以最大限度地減少請求,因此我緩存來自併發隊列中請求的數據,並在隊列達到500時發送數據。我還使用PushQueues來寫入BigQuery,以便客戶端要求不承擔這個時間。如何向我的所有appengine實例發送請求

我已經使用ArrayBlockingQueue成功,但有一個例外:我無法找到一種方法來刷新我的隊列。該場景是請求流量停止。我設置了一個cron.xml來每隔10分鐘發送一次flush消息來獲取最後的消息,但是當然cron請求只能由一個實例處理,所以如果我有10個實例,我可能會有9 x 499記錄卡住了。我真的需要一種方法將這個消息傳遞給所有的實例。

我也試過使用MemCache,但共享隊列所需的互斥標記意味着這不會縮放。

我也試過Datastore,但這有點愚蠢。非常慢,非常昂貴。

我選擇了appengine,所以它會在不同的負載節省成本和管理期間自動縮放,但我真的看不到解決這個問題的方法。

+1

如果您知道某個實例的ID,則可以通過https://instance-dot-version-dot-module-dot-app-id.appspot.com與其聯繫,前提是您是該應用的管理員。 (如果你沒有明確地使用模塊,'module'會被命名爲'default')。不幸的是,我不知道有一個通用的API來列出當前的實例;我相信(不是100%肯定),在手動縮放的情況下,它們會是1,2 ......,但沒有記錄,因此可能會改變。我建議您打開API或gcloud preview app命令的功能請求以列出當前活動(實例,版本,模塊)三元組。 – 2015-03-03 05:54:04

+1

不知道如何嘗試使用它,以什麼方式查找數據存儲緩慢?您是否無法將您的數據推送到Pull Queue中並使用一個或多個cron作業從那裏將其導出到BQ?您可能會發現[本文/視頻](https://developers.google.com/events/io/sessions/332908798)相關。 – tx802 2015-03-03 07:57:30

+0

@Alex謝謝。我認爲使用MemCache和init來註冊每個實例可能是可行的,但不幸的是,使用自動縮放功能無法實現尋址方案,只有[手動和基本](https://cloud.google.com/appengine/docs/ java/modules /#Java_Instance_scaling_and_class) – 2015-03-03 09:55:09

回答

2

我只是將您的數據推送到Pull Queue上,然後使用cron作業將其導出到BigQuery。作爲一個細微的變化,您可以使用cron將4個Push Queue任務排隊15秒,以實現更好的控制。您可能會發現this article/video有關。

拉動隊列對於我們聚合大容量更新來說效果很好,但是如果您要以非常高的速率將任務添加到隊列中,則可能需要分割隊列。 This article解釋了原因。我們目前這樣做,效果很好。

+0

你知道你參考的文章的名字嗎?看起來像那個URL現在已經死了,但是標題我確定可以找到。 – 2016-05-17 18:14:22

+0

如果我谷歌網址,我得到一個頁面[這個視頻](https://www.youtube.com/watch?v=JuaBy3e6fd4),我認爲這可能是一個! – tx802 2016-05-18 10:18:57