পূর্ববর্তী প্রচেষ্টা বিশ্লেষণ করে, মনে হয় যে ওই কৌশল কোন কয়েনটি ইতমধ্যে গণনা করা হয়েছে এবং কোন কয়েনটি এখনও গণনা করা হয় নাই তা জানার যে সামর্থ তা মিস করে, বিশেষ করে বিভিন্ন ডিভাইস থেকে আসা বহুমুখি ঘটমানতার উপস্থিতিতে।
সমস্যার সমাধান হচ্ছে একটি ডিকশনারী হওয়া আপনার ক্লাউড সেভের কাঠামো পরিবর্তন করা যা ইনটিজারে স্ট্রিং ম্যাপ করে। এই ডিকশনারীর মধ্যে প্রতিটা কি-ভ্যালু পেয়ার একটি "drawer" পরিবেশন করে যা কয়েন ধারন করে, এবং সেভের মধ্যে কয়েনের মোট সংখ্যা হচ্ছে সকল এন্ট্রির ভ্যালুর যোগফল। এই ডিজাইনের মূল নীতি হচ্ছে যে প্রতিটা ডিভাইসের তার নিজস্ব ড্রয়ার থাকা, এবং শুধুমাত্র ডিভাইস নিজে ড্রয়ারের মধ্যে কয়েন রাখতে পারবে।
ডিকশনারির কাঠামো হচ্ছে (*A:a, B:b, C:c, ...) যেখানে a হচ্ছে ড্রয়ার A এর মধ্যে রাখা কয়েনের মোট সংখ্যা, b হচ্ছে ড্রয়ার B এর মধ্যে রাখা কয়েনের মোট সংখ্যা এবং এরকম আরও অন্যান্যগুলো।
"drawer" সমাধানের জন্য নতুন কনফ্লিক্ট রেজ্যুলেশন এলগরিদম নিচের মতো:
উদাহরণস্বরূপ, যদি লোকাল ডাটা (A:20, B:4, C:7) হয় এবং ক্লাউড ডাটা (B:10, C:2, D:14) হয় তখন রিজলভড ডাটা (A:20, B:10, C:7, D:14)হবে। উল্লেখ্য যে আপনি কীভাবে এই ডিকশনারিতে কনফ্লিক্ট রেজ্যুলেশন প্রয়োগ করবেন সেটা আপনার অ্যাপের উপর নির্ভর করে। উদাহরনের জন্য বলা যায় কিছু অ্যাপের জন্য আপনি লোয়ার ভ্যাল্যু নিতে চাইতে পারেন। এই নতুন এলগরিদম পরীক্ষা করতে, উপরে বর্নিত পরীক্ষামূলক চিত্রগুলোর কোন একটিতে এটা প্রয়োগ করুন। আপনি দেখতে পারবেন যে এটা একটি সঠিক ফলাফলে পৌচেছে। টেবিল ৩. এর উপর ভিত্তি করে টেবিল ৪. নি¤িœ লিখিত দ্রষ্টব্য ব্যাখ্যা করে:
শুরুতে প্লেয়ারের ২০ কয়েন ছিল। এটা প্রতিটা ডিভাইস এবং ক্লাউডে সঠিকভাবে প্রতিফলিত হয়। এই ভ্যালূ একটি ডিকশনারি (X:20)হিসাবে পরিবেশিত হয় যেখানে X এর ভ্যাল্যূ গুরুত্বপূর্ণ নয়- এই প্ররম্বিক ডাটা কোথা থেকে আসলো সে বিষয়ে আমারা পরোয়া করি না।
যখন প্লেয়ার ডিভাইস A তে ১০০ কয়েন সংগ্রহ করে, এই পরিবর্তন একটি ডিকশনারি হিসাবে প্যাকেজ হয় এবং ক্লাউডে সেভ হয়। ডিকশনারির ভ্যাল্যু হচ্ছে ১০০ কারন ওটা কয়েনের সংখ্যা যা ইউজার ডিভাইস A তে সংগ্রহ করেছেন। এই পয়েন্টে ডাটাতে কোন গণনা সংঘটিত হয় নাই- ডিভাইস A সাদাসিধেভাবে এটাতে ইউজার কর্তৃক সংগৃহিত কয়েনের সংখ্যা রিপোর্ট করে।
কয়েনের প্রতিটা নতুন জমা ডিভাইসের সাথে সম্পৃক্ত ডিকশনারিতে প্যাকেজ হয় যা এটাকে ক্লাউডে সেভ করে। যখন প্লেয়ার ডিভাইস A তে আরও ১০ কয়েন সংগ্রহ করে, উদাহরণস্বরূপ, ডিভাইস A এর ভ্যাল্যু ১১০ এ উন্নিত হয়।
নেট ফলঅফল হচ্ছে যে প্রতিটা ডিভাইসে ইউজার কর্তৃক সংগৃহিত কয়েনের সংখ্যা অ্যাপস জানে। এইভাবে এটা সহজ ভাবে সর্বমোট গণনা করে।
টেবিল ৪. সফল কি-ভ্যাল্যু পেয়ার কৌশল প্রয়োগ
Event | Data on Device A | Data on Device B | Data on Cloud | Actual Total |
---|---|---|---|---|
Starting conditions | (X:20, x) | (X:20, x) | (X:20, x) | 20 |
Player collects 100 coins on device A | (X:20, A:100) | (X:20) | (X:20) | 120 |
Device A saves state to cloud | (X:20, A:100) | (X:20) | (X:20, A:100) | 120 |
Player collects 10 more coins on device A | (X:20, A:110) | (X:20) | (X:20, A:100) | 130 |
Player collects 1 coin on device B | (X:20, A:110) | (X:20, B:1) | (X:20, A:100) | 131 |
Device B attempts to save state to cloud. Conflict detected. | (X:20, A:110) | (X:20, B:1) | (X:20, A:100) | 131 |
Device B solves conflict | (X:20, A:110) | (X:20, A:100, B:1) | (X:20, A:100, B:1) | 131 |
Device A tries to upload its data to the cloud. Conflict detected. | (X:20, A:110) | (X:20, A:100, B:1) | (X:20, A:100, B:1) | 131 |
Device A resolves the conflict | (X:20, A:110, B:1) | (X:20, A:100, B:1) | (X:20, A:110, B:1) total 131 | 131 |