ক্লায়েন্ট-সার্ভার সিঙ্ক্রোনাইজেশন প্যাটার্ন / অ্যালগরিদম?


224

আমার অনুভূতি আছে যে সেখানে অবশ্যই ক্লায়েন্ট-সার্ভারের সিঙ্ক্রোনাইজেশন প্যাটার্ন থাকতে হবে। তবে আমি সম্পূর্ণরূপে একটি গুগল আপ করতে ব্যর্থ।

পরিস্থিতি বেশ সহজ - সার্ভার হ'ল কেন্দ্রীয় নোড, যে একাধিক ক্লায়েন্ট একই ডেটার সাথে সংযোগ স্থাপন করে এবং পরিচালনা করে। সংঘাতের ক্ষেত্রে ডেটা অণুতে বিভক্ত করা যায়, সার্ভারে যা কিছু থাকুক না কেন তার অগ্রাধিকার রয়েছে (সংঘাতের সমাধানে ব্যবহারকারীকে এড়াতে)। সম্ভাব্য পরিমাণে প্রচুর ডেটার কারণে আংশিক সিঙ্ক্রোনাইজেশন পছন্দ করা হয়।

এই ধরনের পরিস্থিতির জন্য কি কোনও নিদর্শন / ভাল অনুশীলন রয়েছে, বা যদি আপনি কোনও কিছুই জানেন না - তবে আপনার পদ্ধতির কী হবে?

নীচে আমি এখন এটি সমাধান করার জন্য কীভাবে চিন্তা করি: সমস্ত লেনদেনের টাইমস্ট্যাম্পযুক্ত তথ্যের সমান্তরাল, একটি পরিবর্তন জার্নাল অনুষ্ঠিত হবে। যখন ক্লায়েন্ট সংযুক্ত হয়, এটি সর্বশেষ পরীক্ষার পর থেকে সমস্ত পরিবর্তনগুলি একীভূত আকারে গ্রহণ করে (সার্ভার তালিকাগুলির মধ্য দিয়ে যায় এবং মোছার পরে অনুসরণযোগ্য সংযোজনগুলি সরিয়ে দেয়, প্রতিটি পরমাণুর জন্য আপডেটগুলি মার্জ করে ইত্যাদি)। সুতরাং, আমরা আপ টু ডেট।

বিকল্পটি প্রতিটি রেকর্ডের জন্য পরিবর্তনের তারিখ রাখবে এবং ডেটা মুছে ফেলার পরিবর্তে এগুলি মুছে ফেলা হিসাবে চিহ্নিত করবে।

কোন চিন্তা?


27
এই ধরণের জিনিসটির জন্য নিদর্শনগুলির খুব কম আলোচনা আছে বলে সম্মত হয়েছেন ... যদিও এই
দৃশ্যটি

উত্তর:


88

আপনার কীভাবে বিতরণ পরিবর্তন পরিচালনার কাজ করে তা লক্ষ্য করা উচিত। ডেল্টাস কাজ পরিচালনা করে এমন এসভিএন, সিভিএস এবং অন্যান্য সংগ্রহস্থলগুলি দেখুন।

আপনার বেশ কয়েকটি ব্যবহারের কেস রয়েছে।

  • পরিবর্তনগুলি সিঙ্ক্রোনাইজ করুন। আপনার পরিবর্তন-লগ (বা ব-দ্বীপের ইতিহাস) পদ্ধতির জন্য এটি দুর্দান্ত দেখাচ্ছে। ক্লায়েন্টরা তাদের ডেল্টা সার্ভারে প্রেরণ করে; সার্ভার ক্লায়েন্টদের ডেল্টাসগুলি একীভূত করে এবং বিতরণ করে। এটি সাধারণ ঘটনা। ডাটাবেসগুলি এটিকে "লেনদেনের প্রতিলিপি" বলে call

  • ক্লায়েন্ট সিঙ্ক্রোনাইজেশন হারিয়েছে। হয় কোনও ব্যাকআপ / পুনরুদ্ধার বা কোনও বাগের কারণে। এই ক্ষেত্রে, ক্লায়েন্টকে ডেল্টাসের মধ্য দিয়ে না গিয়ে সার্ভার থেকে বর্তমান অবস্থা পাওয়া দরকার। এটি মাস্টার থেকে বিশদ সম্পর্কিত একটি অনুলিপি, ডেল্টাস এবং পারফরম্যান্সকে অভিযুক্ত করা হবে। এটি এককালীন জিনিস; ক্লায়েন্ট ভেঙে গেছে; এটি সর্বোত্তম করার চেষ্টা করবেন না, কেবল একটি নির্ভরযোগ্য অনুলিপি প্রয়োগ করুন।

  • ক্লায়েন্ট সন্দেহজনক। এই ক্ষেত্রে, ক্লায়েন্টটি আপ-টু-ডেট রয়েছে এবং কোনও ডেল্টাসের প্রয়োজন কিনা তা নির্ধারণ করতে আপনাকে সার্ভারের সাথে ক্লায়েন্টের তুলনা করতে হবে।

আপনার প্রতিটি পরিবর্তনকে ক্রমিকভাবে সংখ্যায়িত করার ডাটাবেস (এবং এসভিএন) ডিজাইন প্যাটার্নটি অনুসরণ করা উচিত। এইভাবে কোনও ক্লায়েন্ট সিঙ্ক্রোনাইজ করার চেষ্টা করার আগে একটি তুচ্ছ অনুরোধ ("আমার কী সংশোধন করা উচিত?") করতে পারে। এবং তারপরেও, ক্যোয়ারী ("2149 সাল থেকে সমস্ত ডেল্টা") ক্লায়েন্ট এবং সার্ভারটির প্রক্রিয়া করার জন্য আনন্দদায়ক সহজ।


আপনি কি স্যারকে বোঝাতে পারেন ডেল্টা আসলে কী? আমার অনুমানটি হ্যাশ / টাইমস্ট্যাম্প সংমিশ্রণ হবে ... আমি আপনার স্যারের কাছ থেকে শুনতে চাই।
আনিস

একটি ব-দ্বীপ দুটি সংশোধনীর মধ্যে পরিবর্তনকে বোঝায়। উদাহরণস্বরূপ, যদি কোনও ব্যবহারকারীর নাম পরিবর্তিত হয় তবে ডেল্টা {সংশোধন: 123, নাম: "জন দো"}
ডিপোল_মোমেন্ট

31

দলের অংশ হিসাবে, আমি বেশ কয়েকটি প্রকল্প করেছি যা ডেটা সিঙ্কের সাথে জড়িত, তাই আমার এই প্রশ্নের উত্তর দিতে সক্ষম হওয়া উচিত।

ডেটা সিঙ্কিং বেশ বিস্তৃত ধারণা এবং এখানে অনেকগুলি আলোচনার উপায় রয়েছে। এটি তাদের উত্সাহ এবং ডাউনসাইডগুলি সহ বিভিন্ন পদ্ধতির একটি পরিসীমা জুড়ে। দুটি দৃষ্টিভঙ্গির উপর ভিত্তি করে এখানে সম্ভাব্য শ্রেণিবিন্যাসগুলির মধ্যে একটি রয়েছে: সিঙ্ক্রোনাস / এসিনক্রোনাস, ক্লায়েন্ট / সার্ভার / পিয়ার-টু-পিয়ার। সিঙ্কিং বাস্তবায়ন গুরুতরভাবে এই কারণগুলির উপর নির্ভর করে, ডেটা মডেল জটিলতা, স্থানান্তরিত এবং সঞ্চিত ডেটার পরিমাণ এবং অন্যান্য প্রয়োজনীয়তার উপর। সুতরাং প্রতিটি নির্দিষ্ট ক্ষেত্রে পছন্দটি অ্যাপের প্রয়োজনীয়তাগুলি পূরণ করার সহজতম বাস্তবায়নের পক্ষে হওয়া উচিত।

বিদ্যমান অফ-শেল্ফ সমাধানগুলির একটি পর্যালোচনার ভিত্তিতে, আমরা সিঙ্কের বেশ কয়েকটি বড় শ্রেণীর বর্ণনা করতে পারি, সিঙ্ক্রোনাইজেশন সাপেক্ষে বস্তুর গ্রানুলারিটির চেয়ে আলাদা:

  • একটি সম্পূর্ণ দস্তাবেজ বা ডাটাবেসের সিঙ্কিং ক্লাউড-ভিত্তিক অ্যাপ্লিকেশনগুলিতে ব্যবহৃত হয়, যেমন ড্রপবক্স, গুগল ড্রাইভ বা ইয়ানডেক্স.ডিস্ক। যখন ব্যবহারকারী কোনও ফাইল সম্পাদনা করে সংরক্ষণ করে, তখন নতুন ফাইল সংস্করণটি সম্পূর্ণরূপে মেঘে আপলোড করা হবে, পূর্ববর্তী অনুলিপিটি ওভাররাইট করে। কোনও বিরোধের ক্ষেত্রে উভয় ফাইল সংস্করণ সংরক্ষণ করা হয় যাতে ব্যবহারকারী কোন সংস্করণটি আরও প্রাসঙ্গিক তা চয়ন করতে পারে।
  • কী-মান জোড়ার সিঙ্কিং অ্যাপ্লিকেশনগুলিতে একটি সাধারণ ডেটা স্ট্রাকচার সহ ব্যবহার করা যেতে পারে, যেখানে ভেরিয়েবলগুলি অণু হিসাবে বিবেচিত হয়, অর্থাত্ যৌক্তিক উপাদানগুলিতে বিভক্ত নয়। এই বিকল্পটি পুরো দস্তাবেজগুলির সিঙ্ক করার অনুরূপ, কারণ মান এবং নথি উভয়ই সম্পূর্ণরূপে ওভাররাইট করা যায়। তবে, ব্যবহারকারীর দৃষ্টিকোণ থেকে একটি দস্তাবেজ একটি জটিল উপাদান যা অনেকগুলি অংশ নিয়ে গঠিত তবে একটি মূল-মান জুটি একটি সংক্ষিপ্ত স্ট্রিং বা একটি সংখ্যা। সুতরাং, এক্ষেত্রে আমরা সংঘাতের সমাধানের আরও সহজ কৌশলটি ব্যবহার করতে পারি, মানটি আরও প্রাসঙ্গিক বিবেচনা করে, যদি এটি পরিবর্তন হওয়ার ক্ষেত্রে শেষ হয়।
  • গাছ বা গ্রাফ হিসাবে কাঠামোযুক্ত ডেটা সিঙ্ক করা আরও পরিশীলিত অ্যাপ্লিকেশনগুলিতে ব্যবহৃত হয় যেখানে প্রতিটি আপডেটে ডেটাবেস সম্পূর্ণরূপে প্রেরণ করার জন্য ডেটার পরিমাণ যথেষ্ট পরিমাণে থাকে। এই ক্ষেত্রে, বিবাদগুলি পৃথক বস্তু, ক্ষেত্র বা সম্পর্কের স্তরে সমাধান করতে হবে। আমরা প্রাথমিকভাবে এই বিকল্পের উপর দৃষ্টি নিবদ্ধ করছি।

সুতরাং, আমরা এই নিবন্ধটিতে আমাদের জ্ঞানটি গ্রহন করেছি যা আমি মনে করি যে কোর ডেটা বেসড আইওএস অ্যাপ্লিকেশনগুলিতে ডেটা সিঙ্কিং> ( http://blog.denivip.ru/index.php/2014/04) বিষয়ে আগ্রহী প্রত্যেকের পক্ষে খুব দরকারী I / ডেটা-সিঙ্ক-ইন-কোর-ডেটা-ভিত্তিক-আইওএস-অ্যাপস /? ল্যাং = এন )


3
^^^^^^ এটি এখন পর্যন্ত সেরা উত্তর, ছেলেরা!
hgoebl

আমি সম্মত, ডেনিস বিষয়টিতে প্রচুর পরিমাণে এনেছে + নিবন্ধের লিঙ্কগুলি দুর্দান্ত। ড্যানিয়েলপোল উল্লিখিত ওটি সম্পর্কেও কথা বলেন। এস.লোটের উত্তর ভাল তবে এটি গভীরতার চেয়ে অনেক বেশি।
ক্রাইস্টিয়ান

28

আপনার যা প্রয়োজন তা হ'ল অপারেশনাল ট্রান্সফর্ম (ওটি)। এটি এমনকি অনেক ক্ষেত্রে দ্বন্দ্বও পূরণ করতে পারে।

এটি এখনও গবেষণার একটি সক্রিয় ক্ষেত্র, তবে চারপাশে বিভিন্ন ওটি অ্যালগরিদমের বাস্তবায়ন রয়েছে। আমি এখন বেশ কয়েক বছর ধরে এই ধরনের গবেষণার সাথে জড়িত ছিলাম, সুতরাং এই রুটটি আপনার আগ্রহী কিনা তা আমাকে জানান এবং আমি আপনাকে প্রাসঙ্গিক সংস্থানগুলিতে রাখলে খুশি হব।


7
ড্যানিয়েল, প্রাসঙ্গিক সংস্থানগুলির একটি পয়েন্টার প্রশংসা করা হবে।
পরানন্দ

4
আমি কেবল উইকিপিডিয়া নিবন্ধটি পুনরায় পড়ি। এটি একটি দীর্ঘ পথ এসে গেছে এবং পৃষ্ঠার নীচে অনেক প্রাসঙ্গিক উল্লেখ রয়েছে। আমি আপনাকে চেংঝেং সানের কাজের প্রতি ইঙ্গিত করতাম - তার কাজটি উইকিপিডিয়া থেকে উল্লেখ করা হয়েছে। en.wikedia.org/wiki/Operational_transformation । আশা করি এইটি কাজ করবে!
ড্যানিয়েল পল 26:39

13

প্রশ্ন স্ফটিক পরিষ্কার নয়, তবে আমি যদি আপনি থাকতাম তবে আমি আশাবাদী লকিংয়ের দিকে নজর দেব। এটি একটি ক্রম নম্বর দিয়ে প্রয়োগ করা যেতে পারে যা সার্ভার প্রতিটি রেকর্ডের জন্য ফেরত দেয়। যখন কোনও ক্লায়েন্ট পুনরায় রেকর্ডটি সংরক্ষণ করার চেষ্টা করে, এটি সার্ভার থেকে প্রাপ্ত সিকোয়েন্স নম্বরটি অন্তর্ভুক্ত করে। আপডেটটি পাওয়ার সময় যদি সিকোয়েন্স নম্বরটি ডাটাবেসে থাকে তার সাথে মেলে, আপডেটের অনুমতি দেওয়া হয় এবং ক্রম সংখ্যাটি বাড়ানো হয়। যদি সিকোয়েন্স নম্বরগুলি মেলে না, তবে আপডেটটি অনুমোদিত নয়।


2
সিকোয়েন্স নম্বরগুলি এখানে আপনার বন্ধু। অবিরাম বার্তা সারি সম্পর্কে চিন্তা করুন।
ড্যানিয়েল পল 13

7

আমি প্রায় 8 বছর আগে একটি অ্যাপ্লিকেশানের জন্য এর মতো একটি সিস্টেম তৈরি করেছি এবং অ্যাপটির ব্যবহার বাড়ার সাথে সাথে এটি বিকশিত হয়ে উঠতে বেশ কয়েকটি উপায়ে ভাগ করতে পারি।

আমি কোনও পরিবর্তন থেকে "ইতিহাস" সারণীতে যে কোনও ডিভাইস থেকে প্রতিটি পরিবর্তন (সন্নিবেশ করানো, আপডেট করা বা মোছা) লগইন করে শুরু করেছি। সুতরাং, উদাহরণস্বরূপ, যদি কেউ "পরিচিতি" সারণিতে তাদের ফোন নম্বর পরিবর্তন করে, সিস্টেমটি যোগাযোগ.ফোন ক্ষেত্রটি সম্পাদনা করবে এবং ক্রিয়া = আপডেট, ফিল্ড = ফোন, রেকর্ড = [যোগাযোগ আইডি] সহ একটি ইতিহাস রেকর্ড যুক্ত করবে, মান = [নতুন ফোন নম্বর]। তারপরে যখনই কোনও ডিভাইস সিঙ্ক হয়, এটি সর্বশেষ সিঙ্কের পরে থেকে ইতিহাসের আইটেমগুলি ডাউনলোড করে এবং এটি তার স্থানীয় ডাটাবেসে প্রয়োগ করে। এটি উপরে বর্ণিত "লেনদেনের প্রতিলিপি" প্যাটার্নের মতো শোনাচ্ছে।

আইটেমগুলি বিভিন্ন ডিভাইসে তৈরি করা যেতে পারে তখন একটি বিষয় আইডিটিকে অনন্য রাখে। আমি এটি শুরু করার সময় ইউইউডিগুলি সম্পর্কে জানতাম না, তাই আমি স্বতঃবৃদ্ধি আইডি ব্যবহার করেছি এবং কিছু সংশোধিত কোড লিখেছিলাম যা ডিভাইস থেকে আপলোড হওয়া নতুন আইডি চেক করতে কেন্দ্রীয় সার্ভারে চলতে পারে, যদি কোনও বিরোধ হয় তবে তাদের একটি অনন্য আইডিতে পরিবর্তন করুন এবং উত্স ডিভাইসটিকে তার স্থানীয় ডাটাবেসে আইডি পরিবর্তন করতে বলুন। কেবলমাত্র নতুন রেকর্ডগুলির আইডি পরিবর্তন করা খুব খারাপ ছিল না, তবে আমি যদি উদাহরণস্বরূপ, যোগাযোগের সারণীতে একটি নতুন আইটেম তৈরি করি, তবে ইভেন্ট টেবিলে একটি নতুন সম্পর্কিত আইটেম তৈরি করুন, এখন আমার কাছে বিদেশী কী রয়েছে যা আমারও দরকার চেক এবং আপডেট।

অবশেষে আমি শিখেছি যে ইউইউডিগুলি এটি এড়াতে পারে তবে ততক্ষণে আমার ডাটাবেসটি বেশ বড় হয়ে উঠছিল এবং আমি ভয় পেয়েছিলাম যে পুরো ইউইউডি প্রয়োগের ফলে একটি পারফরম্যান্স সমস্যা তৈরি হবে। সুতরাং সম্পূর্ণ ইউআইডিগুলি ব্যবহার না করে আমি এলোমেলোভাবে উত্পন্ন, আইডি হিসাবে 8 টি অক্ষরের আলফানিউমারিক কীগুলি ব্যবহার শুরু করেছিলাম এবং বিরোধগুলি পরিচালনা করতে আমি আমার বিদ্যমান কোডটি রেখে দিয়েছি। আমার বর্তমান 8-চরিত্রের চাবি এবং কোনও ইউআইডি এর 36 টি অক্ষরের মধ্যে অবশ্যই একটি মিষ্টি স্পট থাকতে হবে যা অপ্রয়োজনীয় ফোলা ছাড়াই দ্বন্দ্বগুলি দূর করবে, তবে যেহেতু আমার কাছে ইতিমধ্যে দ্বন্দ্বের সমাধানের কোড রয়েছে, তাই এটির সাথে পরীক্ষার অগ্রাধিকার হয়নি hasn't ।

পরবর্তী সমস্যাটি হ'ল ইতিহাসের টেবিলটি ডাটাবেসের পুরো অংশের চেয়ে 10 গুণ বড় ছিল। এটি স্টোরেজ ব্যয়বহুল করে তোলে এবং ইতিহাসের টেবিলের যে কোনও রক্ষণাবেক্ষণ কষ্টদায়ক হতে পারে। পুরো টেবিলটি রাখার ফলে ব্যবহারকারীরা আগের কোনও পরিবর্তন ফিরিয়ে আনতে দেয়, তবে এটি ওভারকিলের মতো মনে হতে শুরু করে। সুতরাং আমি সিঙ্ক প্রক্রিয়াটিতে একটি রুটিন যুক্ত করেছি যেখানে কোনও ডিভাইস সর্বশেষ ডাউনলোড করা ইতিহাসের আইটেমটি যদি ইতিহাস টেবিলে আর উপস্থিত না থাকে তবে সার্ভার এটিকে সাম্প্রতিক ইতিহাসের আইটেম দেয় না, পরিবর্তে এটি সমস্ত ডেটাযুক্ত ফাইল দেয় gives যে অ্যাকাউন্ট। তারপরে আমি 90 দিনের পুরানো ইতিহাস আইটেমগুলি মুছতে একটি ক্রোনজব যুক্ত করেছি। এর অর্থ ব্যবহারকারীরা এখনও 90 দিনেরও কম পুরানো পরিবর্তনগুলি রোল করতে পারবেন এবং যদি তারা প্রতি 90 দিনে অন্তত একবার সিঙ্ক করেন তবে আপডেটগুলি আগের মতো বর্ধিত হবে। তবে যদি তারা 90 দিনের বেশি অপেক্ষা করে,

এই পরিবর্তন ইতিহাসের টেবিলের আকারটি প্রায় 90% হ্রাস করেছে, সুতরাং এখন ইতিহাসের সারণিটি বজায় রাখা কেবলমাত্র দশগুণের পরিবর্তে ডাটাবেসকে দ্বিগুণ করে তোলে। এই সিস্টেমের আরেকটি সুবিধা হ'ল প্রয়োজনের সাথে সিঙ্কিং হিস্ট্রি টেবিল ছাড়া এখনও কাজ করতে পারে - যেমন আমাকে অস্থায়ীভাবে অফলাইনে নিয়ে যাওয়া কিছু রক্ষণাবেক্ষণের প্রয়োজন হয়। অথবা আমি অ্যাকাউন্টের জন্য বিভিন্ন মূল্য পয়েন্টে বিভিন্ন রোলব্যাক সময়কাল অফার করতে পারি। এবং ডাউনলোড করতে যদি 90 দিনেরও বেশি পরিবর্তন হয় তবে সম্পূর্ণ ফাইলটি সাধারণত বর্ধিত বিন্যাসের চেয়ে বেশি দক্ষ।

যদি আমি আজ থেকে শুরু করতাম, আমি আইডি সংঘাতের চেকিং এড়িয়ে যাব এবং কেবলমাত্র যদি কিছু ক্ষেত্রে ত্রুটি পরীক্ষা করা হয় তবে দ্বন্দ্ব দূর করতে যথেষ্ট মূল দৈর্ঘ্যের লক্ষ্য রাখি। তবে ইতিহাসের সারণী এবং সাম্প্রতিক আপডেটগুলির জন্য বাড়তি ডাউনলোডগুলির সংমিশ্রণ বা প্রয়োজনের সময় একটি সম্পূর্ণ ডাউনলোড ভাল কাজ করছে।


1

ব-দ্বীপ (পরিবর্তন) সিঙ্ক জন্য, আপনি পরিবর্তনগুলি ফিরে সব সদস্যতা ক্লায়েন্ট প্রকাশ করতে pubsub প্যাটার্ন ব্যবহার করতে পারেন, মত পরিষেবাগুলিতে বিমানপোত এটা করতে পারেন।

ডাটাবেস মিরর জন্য, কিছু ওয়েব ফ্রেমওয়ার্কগুলি ব্রাউজার ডাটাবেসে স্থানীয় সাথে সার্ভার সাইড ডেটাবেস সিঙ্ক করতে স্থানীয় মিনি ডাটাবেস ব্যবহার করে, আংশিক সিঙ্ক্রোনাইজেশন সমর্থিত। মিটার পরীক্ষা করুন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.