1

我有一個名爲lineItems的數據存儲實體,它包含要開發票的各個行項目。用戶找到訂單項並將採購訂單號附加到訂單項。這些顯示在他們可以創建發票的網頁上。數據存儲有時無法獲取所有需要的實體,但第二次運行

我會顯示用於獲取實體的代碼,但我認爲它並不重要,因爲幾個月前當我使用託管虛擬機並且代碼完全不同時,這也發生了幾次。 (我之前使用了objectify,現在我正在使用數據存儲API)。簡而言之,我目前只是使用了StructuredQuery.setFilter(新的PropertyFilter.eq(「POnum」,ponum))。setFilter(new PropertyFilter.eq(「Invoiced」,false)); (這是僞代碼,你不能這樣做.setFilters是這樣的,真正的代碼接受一個PropertyFilters列表,並正確創建一個複合過濾器。)

今天早上發生的事是管理員創建了發票,所有但其中兩條是在發票上。有兩行代碼從未獲取,並且這些行被卡在「要創建的發票」部分。

管理員只是爲給定的採購訂單編號重新創建了發票,但第二次DID接收剩餘的兩行並創建了第二個發票。

請注意,這些實體幾乎在24小時前(當她爲他們分配採購訂單號時)創建/編輯,因此他們在數據庫中坐了很長一段時間。 (我檢查了我的日誌)。這不是他們剛剛創建的情況,然後試圖在短時間內訪問。這也不是沒有更新實體的情況 - 代碼在第三方會計軟件包中創建發票,而他們根本就不在那裏。發票創建成功後,所有實體都將更新爲「invoiced = true」並寫入數據存儲區。因此,會計程序中未包含在發票中的行是那些未在數據存儲中更新的行。 (這不是「智能」檢查,它不會逐行檢查,它只是檢查發票創建是否成功,然後更新它在內存中的所有實體)。

據我所知,數據存儲沒有返回所有與第一次查詢匹配的實體,但它第二次返回。

大約有40'000個lineItem實體。

什麼情況會導致數據存儲區獲取隨機失敗獲取所有滿足StructuredQuery的搜索參數的實體? (請注意,在現在不推薦使用的Managed VM架構上使用Objectify時,這也會發生兩次。)如何阻止這種情況發生,或者檢查它是否發生?

+0

有了物化,你很可能從內存緩存抓住一切並沒有打擾瓦特/數據存儲。如果你不使用父母/孩子的關係來尋找東西,那很困難。你也應該在可能的情況下查看數據的非規範化。 –

+0

我沒有使用memcache ...並且使用靈活的應用程序引擎數據存儲區API獲取了與新代碼相同的問題。這只是一個簡單的搜索,返回一個List,其中purchaseOrder =「123456」。該代碼運行一次,並拿起8/10個實體。然後用戶再次運行它,並且獲取了最後兩個實體...實體在此之前24小時更新,並且在此之前正確訪問實體。它似乎是一個隨機錯誤讀出3的情況。(一個用於顯示頁面上的數據,一個用於處理數據,最後一個用戶重新處理數據)。 – KevinG

+0

我不確定父/子關係的好處是什麼......如果我的實體中有一個名爲「purchaseOrderNumber」,「invoiceNumber」等的字段...我想保持簡單隻需搜索「purchaseOrderNumber」的所有實體。 (實際上它比這更復雜,採購訂單編號,工單號碼,授權地點,工作日期......所有這些字段的組合匹配決定了每張發票的內容。發票創建後,我可以看到使用父母/子女關係,因爲每個實體只有一個父母......) – KevinG

回答

1

您可能會看到最終的一致性,因爲您沒有使用祖先查詢。

參見:https://cloud.google.com/datastore/docs/articles/balancing-strong-and-eventual-consistency-with-google-cloud-datastore/

+0

我不相信這是事實。該實體最後於7月26日更新。 7月27日上午8:08,查詢被執行,並且錯過了2個實體。大約30秒鐘後,用戶再次運行查詢,只是這次它拾起了​​第一次錯過的兩個實體......另外,要在「要創建的發票」部分中首先顯示數據,相同代碼用於獲取實體。所以它顯示工作,無法再從服務器獲取它們,然後第三次獲取工作。 – KevinG

相關問題