2014-01-21 142 views
0

在我的服務器實現中使用GAE搜索API並且遇到了奇怪且無證的行爲。某些時候剛添加到索引(Index.put())的新文檔不會被直接執行的搜索(Index.search())檢索到。有時甚至需要一分鐘左右,直到可用。GAE - 搜索API - 搜索不會返回新添加的文檔

它看起來像一個最終一致性問題,但我無法找到該甚至提到這個問題關係到搜索API的documents什麼。奇怪的是,在這段時間這些文件不可用,我可以在管理控制檯上執行完全相同的查詢,並獲得預期的結果。

任何人都知道這裏的交易是什麼?這是一個正常的行爲?如果是這樣,那麼新增文檔的最大時間是多少,直到它可以被搜索?爲什麼沒有記錄?這嚴重影響了我的應用程序的功能。

謝謝。

+0

此行爲已得到谷歌認可。見[鏈接](https://code.google.com/p/googleappengine/issues/detail?id=10521&q=Fulltextsearch&colspec=ID%20Type%20Component%20Status%20Stars%20Summary%20Language%20Priority%20Owner%20Log) – AsafK

回答

0

是的,它是有道理的,最終一致性(Brewer's keynote PDF)也適用於搜索。沒有記錄的最大收斂時間可能意味着實施一個平衡會起反作用。沒有時間保證,GAE甚至可能在未來發展和行爲不同。我聽說有些GAE用戶遷移到Riak,以調整他們的CAP參數以適應特定的應用時序要求。

在不同的時間出現在不同的子系統的最新寫的症狀建議分佈式cacheing。您最好的策略是重新設計您的功能,以減少對時間的依賴。大多數可擴展的應用程序已經做到了。

+0

首先感謝您的回答。其次,作爲這種無證行爲的原因,你說「GAE甚至可能會演變並在未來表現不同」,但這對於任何產品提供的每項服務都是如此。我認爲像谷歌這樣的PaaS提供商有義務發佈其服務的任何限制,並且一旦這些限制發生變化(如他們正在使用其他服務),就會重新發布。好的,非常抱歉。在下一條評論中繼續... – AsafK

+0

我認爲對於我來說遷移到另一個平臺有點太晚了,關於重新設計,我可以簡要描述我的要求 - 我的應用程序允許用戶動態地爲地圖添加興趣點。一旦用戶添加了一個,他想在搜索時馬上看到它。正如您可能理解的那樣,此搜索是使用Search API完成的。我現在唯一能想到的解決方案是放棄免責聲明,說他的POI可能需要一段時間才能進行搜索......你說什麼? – AsafK

+0

有關該需求的更多信息可以更清楚地解釋您遇到的問題。您的用戶應該能夠立即看到所有添加內容,這非常有意義。它也給了我另一個答案的想法,我現在將開始寫... –

1

從您的其他意見是合乎邏輯的和絕對必要的,所有新加入的點 - 的利益必須出現在用戶的地圖上。然而,搜索服務可能會繼續不會在不可預測的時間內返回新增加的內容。我會考慮兩種策略,一種是服務器端,另一種是客戶端,甚至可能同時使用兩種策略。但這兩者都不簡單。

在你可以增加搜索服務,甚至完全與您將自行開發的定製搜索替換服務器。將您想要搜索的數據存儲在基本上是MySQL的Google Cloud SQL中。這將始終立即返回寫入的內容,因爲它是一個不受最終一致性約束的實例。

在客戶端中,您可以緩存所有最近添加的興趣點。然後,當從服務器請求數據時,還查詢本地緩存。刪除所有重複服務器返回的本地結果。其他用戶也將最終看到此用戶立即看到的內容。

+0

它是一個恥辱,我必須解決這些類型的解決方案。實際上,我已經認爲你的第二個建議(客戶端)是解決這個問題的一種解決方法,我認爲我比第一個建議更喜歡它,我失去了NoSQL DB的可伸縮性和可用性優勢。我不會選擇你的答案,因爲它沒有真正給出我的問題的官方基準答案,但我會爲你付出的努力而努力。非常感謝。 – AsafK

+0

感謝您的反饋。我同意在客戶端添加解決方法更好。 –