मुझे परमाणु परिवर्तन लॉग के रूप में उपयोग करने के लिए डेटा संरचना पर एक सलाह चाहिए।एक परिवर्तन लॉग के रूप में एसटीएम-अनुकूल सूची
मैं निम्नलिखित एल्गोरिदम लागू करने की कोशिश कर रहा हूं। इन-मेमोरी मैप को अपडेट करने वाले आने वाले परिवर्तनों का प्रवाह है। हास्केल की तरह स्यूडोकोड में यह
update :: DataSet -> SomeListOf Change -> Change -> STM (DataSet, SomeListOf Change)
update dataSet existingChanges newChange = do
...
return (dataSet, existingChanges ++ [newChange])
जहां डेटासेट नक्शा दिया गया है है (वर्तमान में यह STM-कंटेनरों पैकेज, https://hackage.haskell.org/package/stm-containers-0.2.10/docs/STMContainers-Map.html से मानचित्र है)। संपूर्ण "अद्यतन" को थ्रेड की मनमानी संख्या से बुलाया जाता है। कुछ परिवर्तनों को डोमेन सेमेन्टिक्स के कारण खारिज कर दिया जा सकता है, मैं लेनदेन के प्रभाव को फेंकने के लिए फेंस्टएमएम का उपयोग करता हूं। सफल प्रतिबद्धता के मामले में सूची में "newChange" जोड़ा जाता है।
flush :: STM (DataSet, SomeListOf Change) -> IO()
इस समारोह में परिवर्तन (यह एक सुसंगत जोड़ी गया है) की सूची के साथ एक साथ डेटासेट की वर्तमान स्नैपशॉट ले और करने के लिए इसे फ्लश करने के लिए माना जाता है:
अलग थ्रेड जो निम्नलिखित फ़ंक्शन को कॉल भी बना हुआ है फाइल सिस्टम, यानी
flush data = do
(dataSet, changes) <- atomically $ readTVar data_
-- write them both to FS
-- ...
atomically $ writeTVar data_ (dataSet, [])
मुझे "कुछ सूची बदलें" के लिए उपयोग करने के लिए डेटा संरचना के बारे में एक सलाह चाहिए। मैं [चेंज] का उपयोग नहीं करना चाहता क्योंकि यह "बहुत आदेश दिया गया" है और मुझे डर है कि बहुत सारे संघर्ष होंगे, जो पूरे लेनदेन को फिर से प्रयास करने के लिए मजबूर करेंगे। अगर मैं यहाँ गलत हूं, तो कृपया मुझे सही करें।
मैं सेट (https://hackage.haskell.org/package/stm-containers-0.2.10/docs/STMContainers-Set.html) का उपयोग नहीं कर सकता क्योंकि मुझे अभी भी कुछ ऑर्डर को संरक्षित करने की आवश्यकता है, उदा। लेनदेन का आदेश करता है। मैं इसके लिए टीसीएचएन का उपयोग कर सकता हूं और यह एक अच्छा मैच (बिल्कुल लेनदेन करने का आदेश) जैसा दिखता है, लेकिन मुझे नहीं पता कि "फ्लश" फ़ंक्शन को कैसे कार्यान्वित किया जाए ताकि वह पूरे परिवर्तन लॉग को लगातार एक साथ देख सके डेटासेट के साथ।
वर्तमान कार्यान्वयन यहां https://github.com/lolepezy/rpki-pub-server/blob/add-storage/src/RRDP/Repo.hs है, कार्यों में क्रमशः क्रियाएंस्टेट और rrdpSyncThread लागू होते हैं। यह टीसीएचएन का उपयोग करता है और ऐसा लगता है कि यह गलत तरीके से करता है।
अग्रिम धन्यवाद।
अद्यतन: एक उचित जवाब है कि
type SomeListOf c = TChan [c]
update :: DataSet -> TChan [Change] -> Change -> STM DataSet
update dataSet existingChanges newChange = do
...
writeTChan changeChan $ reverse (newChange : existingChanges)
return dataSet
flush data_ = do
(dataSet, changes) <- atomically $ (,) <$> readTVar data_ <*> readTChan changeChan
-- write them both to FS
-- ...
की तरह प्रतीत हो रहा है लेकिन मैं अभी भी यकीन नहीं है कि यह एक साफ समाधान है चैनल के एक तत्व के रूप में पूरी सूची पारित करने के लिए नहीं कर रहा हूँ।
मैंने आपका प्रश्न सावधानी से नहीं पढ़ा, लेकिन 'टीसीहान' एक मृत-सरल '([ए], [ए])' कार्यात्मक डेक्यू है; ऐसा लगता है कि यह आपके लिए अपनी विविधता को लागू करने के लिए समझ में आ सकता है। – jberryman
मुझे पूछने दो: संरचना तक पहुंचने के लिए कितने धागे (कम से कम एक मोटा संख्या) की उम्मीद है? और उनमें से कितने एक समय में? परिवर्तनों की सूची में वृद्धि की आप कितनी बड़ी उम्मीद करते हैं? –
क्या आपको अन्य 'एसटीएम' संचालन के साथ 'अपडेट' लिखना भी आवश्यक है, या क्या यह हमेशा अपने लेनदेन में चलता है? –