আপনি কতটা বেস্ট দ্বি-দিকনির্দেশক সিঙ্ক উপস্থাপন করবেন?


23

এমন একটি সিস্টেম ধরে নেওয়া যেখানে একটি রিসোর্স সহ একটি ওয়েব অ্যাপ্লিকেশন এবং অন্য অনুরূপ সংস্থান সহ একটি রিমোট অ্যাপ্লিকেশনটির একটি রেফারেন্স, আপনি কীভাবে দ্বি-দিকনির্দেশক সিঙ্ক ক্রিয়াকে উপস্থাপন করবেন যা 'রিমোট' রিসোর্সের সাথে 'স্থানীয়' সংস্থানকে সিঙ্ক্রোনাইজ করে?

উদাহরণ:

আমার এমন একটি এপিআই রয়েছে যা একটি টুডো তালিকা উপস্থাপন করে।

GET / POST / PUT / DELETE / todos / ইত্যাদি

সেই এপিআই দূরবর্তী টোডো পরিষেবাগুলি উল্লেখ করতে পারে।

GET / POST / PUT / DELETE / todo_services /, ইত্যাদি

আমি আমার API এর মাধ্যমে প্রক্সির মাধ্যমে দূরবর্তী পরিষেবা থেকে টডস হেরফের করতে পারি

GET / POST / PUT / DELETE / todo_services / abc123 /, ইত্যাদি

আমি একটি স্থানীয় সেট টোডস এবং টোডসের রিমোট সেটের মধ্যে দ্বি-দিকনির্দেশক সিঙ্ক করার সক্ষমতা চাই।

একটি rpc সাজানোর উপায়, এক করতে পারে

পোস্ট / টোডো-সার্ভিসেস / অ্যাবসি 123 / সিঙ্ক /

তবে, "ক্রিয়াগুলি খারাপ" ধারণাটিতে, এই ক্রিয়াটি উপস্থাপন করার জন্য আরও ভাল কোনও উপায় আছে কি?


4
আমি মনে করি যে একটি ভাল এপিআই ডিজাইন সিঙ্কের দ্বারা আপনি কী বোঝাতে চাইছেন তার একটি খুব কংক্রিট বোঝার উপর একেবারে নির্ভরশীল দুটি ডেটা উত্সের "সিঙ্ক" হ'ল একটি জটিল সমস্যা যা ওভারস্পিম্পাইফাই করা খুব সহজ তবে এর সমস্ত প্রভাবগুলির মধ্যে দিয়ে চিন্তা করা খুব কঠিন। এটিকে একটি "দ্বি-দিকনির্দেশক" সিঙ্ক করুন এবং হঠাৎ অসুবিধাটি অনেক বেশি। আসা খুব কঠিন প্রশ্ন মাধ্যমে চিন্তা করে শুরু করুন।
অ্যাডাম ক্রসল্যান্ড

ডান - ধরুন সিঙ্ক অ্যালগরিদমটি "কোড-স্তর" API এ ডিজাইন করা এবং কার্যকরী - আমি কীভাবে এটি আরইএসটি-র মাধ্যমে প্রকাশ করব। একটি উপায় সিঙ্কটি প্রকাশ করা আরও সহজ বলে মনে হচ্ছে: আমি GET /todo/1/এবং POSTএটির কাছে /todo_services/abc123/ কিন্তু 2 উপায় - আমি কোনও ডেটাসেট নিচ্ছি না এবং এটি কোনও উত্সে রেখে দিচ্ছি, আমি যে ক্রিয়াটি গ্রহণ করছি তা আসলে দুটি সংস্থার সম্ভাব্য পরিবর্তনের ফলাফল results আমি অনুমান করি যে আমি "টুডো সিঙ্ক্রোনাইজেশনগুলি" নিজেই সংস্থান করে ফিরতে পারি POST /todo_synchronizations/ {"todos":["/todo/1/","/todo_services/abc123/1"],"schedule":"now"}
এডওয়ার্ড এম স্মিথ

আমাদের কাছে ঘোড়ার আগে একটি কার্ট রয়েছে। আমার বক্তব্যটি হ'ল আপনি সিঙ্কটি কেবলমাত্র কাজ করে এবং এপিআই ডিজাইন করতে পারবেন না। সিঙ্কের অ্যালগরিদম ঠিক কীভাবে কাজ করে তা নিয়ে অসংখ্য উদ্বেগের দ্বারা এপিআইয়ের নকশা চালিত হবে।
অ্যাডাম ক্রসল্যান্ড

এটি সম্ভাব্যভাবে কার্যকর ফলাফলগুলি প্রকাশ করে: GET /todo_synchronizations/1=>{"todos":["/todo/1/","/todo_services/abc123/1"],"schedule":"now","ran_at":"datetime","result":"success"}
এডওয়ার্ড এম স্মিথ

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

উত্তর:


17

কোথায় এবং কি সংস্থান আছে?

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

সুতরাং, প্রশ্নটি হয়ে ওঠে: সংস্থার সংস্থান সম্পর্কে কেউ কীভাবে চিন্তা করে?

দ্বি-দিকনির্দেশক সিঙ্ক কী? **

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

সুতরাং যে মূল উত্সটি সম্বোধন করা দরকার তা হ'ল একটি লেনদেন লগ এবং অতএব, একটি সিঙ্ক প্রক্রিয়া এইচটিটিপি-র অধীনে "আইটেমগুলি" সংগ্রহের জন্য দেখতে এই জাতীয় দেখাচ্ছে:

পদক্ষেপ 1 - স্থানীয় লেনদেনের লগ পুনরুদ্ধার করে

স্থানীয়: GET /remotehost/items/transactions?earliest=2000-01-01T12:34:56.789Z

রিমোট: 200 ঠিক আছে যাতে শরীরের সাথে লেনদেনের লগ থাকে এটির মতো ক্ষেত্রগুলি থাকে।

  • itemId - একটি ইউআইডি একটি ভাগ করা প্রাথমিক কী সরবরাহ করার জন্য

  • updatedAt - ডেটা সর্বশেষ আপডেট করার সময় একটি সমন্বিত বিন্দু সরবরাহ করার জন্য টাইমস্ট্যাম্প (ধরে নেওয়া উচিত যে পুনর্বিবেচনার ইতিহাসের প্রয়োজন নেই)

  • fingerprint- updateAtকয়েক সেকেন্ডের বাইরে থাকলে দ্রুত তুলনার জন্য ডেটার সামগ্রীর একটি SHA1 হ্যাশ

  • itemURI - পরে পুনরুদ্ধারের অনুমতি দেওয়ার জন্য আইটেমটিতে একটি সম্পূর্ণ ইউআরআই

পদক্ষেপ 2 - স্থানীয় তার নিজের সাথে দূরবর্তী লেনদেনের লগের তুলনা করে

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

টান অনুরোধগুলি দূরবর্তী নোডের বিরুদ্ধে করা হয় যাতে ডেটা ব্যবহার করে স্থানীয়ভাবে উপস্থিত থাকে itemURI। এগুলি স্থানীয়ভাবে পরে প্রয়োগ করা হয় না।

পদক্ষেপ 3 - রিমোটে স্থানীয় সিঙ্ক লেনদেনের লগ চাপুন

স্থানীয়: PUT /remotehost/items/transactions স্থানীয় সিঙ্ক লেনদেন লগযুক্ত বডি সহ।

রিমোট নোড এটি সমকালীনভাবে প্রক্রিয়াজাত করতে পারে (এটি যদি ছোট এবং দ্রুত হয়) বা অ্যাসিনক্রোনাসলি ( 202 স্বীকৃত ভাবেন ) যদি এতে প্রচুর ওভারহেড লাগতে পারে। সিঙ্ক্রোনাস অপারেশন ধরে নিলে সাফল্য বা ব্যর্থতার উপর নির্ভর করে ফলাফলটি 200 ওকে বা 409 কনফ্লিক্ট হবে409 কনফ্লিক্টের ক্ষেত্রে , তারপরে প্রক্রিয়াটি আবার শুরু করতে হবে যেহেতু রিমোট নোডে একটি আশাবাদী লক ব্যর্থতা হয়েছে (সিঙ্কের সময় কেউ ডেটা পরিবর্তন করেছে)। রিমোট আপডেটগুলি তাদের নিজস্ব অ্যাপ্লিকেশন লেনদেনের আওতায় প্রক্রিয়া করা হয়।

পদক্ষেপ 4 - স্থানীয়ভাবে আপডেট করুন

পদক্ষেপ 2 এ টানা ডেটা স্থানীয়ভাবে প্রয়োগ লেনদেনের আওতায় প্রয়োগ করা হয়।

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


6

আমি একটি সিঙ্ক্রোনাইজেশন অপারেশনটিকে এমন একটি সংস্থান হিসাবে বিবেচনা করব যা অ্যাক্সেস করা যায় (জিইটি) বা তৈরি করা যায় (পোষ্ট)। এই বিষয়টি মাথায় রেখে, API এর URL হতে পারে:

/todo_services/abc123/synchronization

(একে "সিঙ্ক্রোনাইজেশন" বলা, এটি একটি ক্রিয়া নয় এটি পরিষ্কার করার জন্য "সিঙ্ক" নয়)

তারপরে:

POST /todo_services/abc123/synchronization

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

GET /todo_services/abc123/synchronization?id=12345

3
এই সহজ উত্তর উত্তর। আপনার ক্রিয়াগুলি বিশেষ্যগুলিতে পরিণত করুন এবং এগিয়ে যান ...
এইচডিভে

5

এটি একটি কঠিন সমস্যা. আমি বিশ্বাস করি না যে সিআরসিটি সিঙ্ক বাস্তবায়নের জন্য একটি উপযুক্ত স্তর। একটি শক্তিশালী সিঙ্কের মূলত বিতরণ লেনদেন হওয়া দরকার। আরআরইএসটি সেই কাজের জন্য সরঞ্জাম নয়।

(অনুমান: "সিঙ্ক" দ্বারা আপনি বোঝাচ্ছেন যে যে কোনও সংস্থান যে কোনও সময় অন্যের থেকে স্বতন্ত্রভাবে পরিবর্তিত হতে পারে এবং আপডেটগুলি না হারিয়ে সেগুলি পুনরায় স্বাক্ষর করার ক্ষমতা আপনি চান))

আপনি একজনকে "মাস্টার" এবং অন্যটিকে "ক্রীতদাস" বানানোর কথা বিবেচনা করতে পারেন যাতে আপনি আত্মবিশ্বাসের সাথে মাস্টের ডেটা সহ পর্যায়ক্রমে দাসকে আঁকড়ে ধরে রাখতে পারেন।

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


5
"কঠিন সমস্যা" এর জন্য +1। দ্বি-দিকনির্দেশক সিঙ্কিং হ'ল এমন একটি জিনিস যা আপনি বুঝতে পারবেন না যে আপনি কাদায় গভীর না হওয়া পর্যন্ত এটি কতটা কঠিন।
ড্যান রে

2

অ্যাপাচি কাউচডিবি একটি ডাটাবেস যা REST, HTTP, এবং JSON এর উপর ভিত্তি করে। বিকাশকারীরা HTTP- র মাধ্যমে প্রাথমিক সিআরইউডি অপারেশন করে। এটি একটি প্রতিলিপি মেকানিজম সরবরাহ করে যা পিয়ার-টু পিয়ার কেবল এইচটিটিপি পদ্ধতি ব্যবহার করে।

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

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

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


আমি কাউচডিবি পছন্দ করি এবং এটি উত্তরাধিকারী কাউচবেস + সিঙ্কগেটওয়ে। +1
লিওনিড উসোভ

-1

একটি সাধারণ নামকরণের সাথে আপনি "ক্রিয়াগুলি খারাপ" সমস্যার সমাধান করতে পারেন - "সিঙ্ক" এর পরিবর্তে "আপডেট" ব্যবহার করুন।

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

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