মংগোডিবিতে লেনদেনের অভাবকে ঘিরে কীভাবে কাজ করবেন?


139

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

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

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

এই সরলীকৃত সিস্টেমে নিম্নলিখিত পদক্ষেপগুলি সহ একটি এসএমএস প্রেরণের টাস্কটি কল্পনা করুন:

  1. ব্যবহারকারীর পর্যাপ্ত ব্যালেন্স রয়েছে কিনা তা পরীক্ষা করুন; পর্যাপ্ত creditণ না থাকলে অ্যাক্সেস অস্বীকার করুন

  2. বিশদ এবং ব্যয় সহ এসএমএস সংগ্রহের মধ্যে বার্তাটি প্রেরণ এবং সঞ্চয় করুন (লাইভ সিস্টেমে statusমেসেজটির একটি বৈশিষ্ট্য থাকবে এবং কোনও কাজ এটিকে সরবরাহের জন্য গ্রহণ করবে এবং এসএমএসের বর্তমান অবস্থা অনুযায়ী দাম নির্ধারণ করবে)

  3. প্রেরিত বার্তার দাম দ্বারা ব্যবহারকারীদের ভারসাম্য হ্রাস করুন

  4. লেনদেন সংগ্রহে লেনদেন লগ

এখন তাতে সমস্যা কী? মঙ্গোডিবি কেবলমাত্র একটি নথিতে পারমাণবিক আপডেট করতে পারে। পূর্বের প্রবাহে এটি ঘটতে পারে যে কোনও ধরণের ত্রুটিটি প্রবেশ করে এবং বার্তাটি ডাটাবেসে সঞ্চিত হয়ে যায় তবে ব্যবহারকারীর ভারসাম্য আপডেট হয় না এবং / অথবা লেনদেনটি লগ হয় না।

আমি দুটি ধারণা নিয়ে এসেছি:

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

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

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


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

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

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

9
আমি বুঝতে পারি যে কাজের জন্য আমার উপযুক্ত সরঞ্জামটি ব্যবহার করা উচিত। তবে আমার জন্য - যখন আমি এই জাতীয় উত্তরগুলি পড়ি - মনে হয় নোটএসকিউএল এমন কোনও তথ্যের জন্য ভাল নয় যেখানে ডেটা সমালোচনামূলক। এটি ফেসবুক বা টুইটারের পক্ষে খুব ভাল যেখানে কিছু মন্তব্য হারিয়ে গেলে বিশ্ব চলতে থাকে তবে এর উপরের কিছু ব্যবসায়ের বাইরে থাকে। যদি এটি সত্য হয় তবে বিল্ডিং সম্পর্কে অন্যের যত্ন কেন আমি তা পাই না। মঙ্গোডিবি'র একটি ওয়েব স্টোর : কাইলব্যাঙ্কার.com / blog / 2010 / 04 / 30 / mongodb- এবং-ecommerce এমনকি এটি উল্লেখ করেছে যে বেশিরভাগ লেনদেন পারমাণবিক ক্রিয়াকলাপ দিয়ে কাটিয়ে উঠতে পারে। আমি যা খুঁজছি তা কীভাবে হয়।
নাগিআই

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

উত্তর:


23

৪.০ হিসাবে, মঙ্গোডিবিতে মাল্টি-ডকুমেন্ট এসিডি লেনদেন হবে। পরিকল্পনাটি হ'ল প্রতিলিপি সেট মোতায়েনকারীদের প্রথমে সক্ষম করা, তারপরে তীক্ষ্ণ ক্লাস্টারগুলি। মঙ্গোডিবি-র লেনদেনগুলি ঠিক একইভাবে সংযুক্ত ডেটাবেসগুলি থেকে যেমন লেনদেনের বিকাশকারীদের সাথে পরিচিত সেগুলি অনুভব করবে - তারা অনুরূপ শব্দার্থবিজ্ঞান এবং বাক্য গঠন (যেমন start_transactionএবং commit_transaction) সহ বহু-বিবৃতি হবে । গুরুত্বপূর্ণভাবে, মংগাডিবি-র পরিবর্তনগুলি যা লেনদেন সক্ষম করে এমন কাজের চাপের জন্য যেগুলির প্রয়োজন হয় না তার কার্য সম্পাদনকে প্রভাবিত করে না।

আরও তথ্যের জন্য এখানে দেখুন

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


1
লেনদেন এসেছে! 4.0 GA'ed। mongodb.com/blog/post/…
গ্রিগরি মেলনিক

মংগোডিবি লেনদেনের এখনও লেনদেনের আকারের সীমাবদ্ধতা রয়েছে 16 এমবি, সম্প্রতি আমার একটি ব্যবহারের ঘটনা ঘটেছে যেখানে আমাকে একটি ফাইল থেকে 50k রেকর্ডগুলি মঙ্গোডিবিতে লাগানো দরকার, তাই পারমাণবিক সম্পত্তি বজায় রাখতে আমি লেনদেনের ব্যবহারের কথা ভেবেছিলাম তবে 50 কে জেসন রেকর্ড এই সীমা অতিক্রম করে, এটি ত্রুটিটি ছুঁড়ে দেয় "সমস্ত লেনদেনের ক্রিয়াকলাপের মোট আকার 16793600 এর চেয়ে কম হওয়া উচিত Act প্রকৃত আকার 16793817"। আরও তথ্যের জন্য আপনি অফিশিয়াল জিরা টিকিটটি
গৌতম মালিক

মঙ্গোডিবি 4.2 (বর্তমানে বিটাতে, আরসি 4) বড় লেনদেনকে সমর্থন করে। একাধিক ওপ্লগ এন্ট্রি জুড়ে লেনদেন উপস্থাপন করে, আপনি একক এসিডি লেনদেনে 16 এমবি এর বেশি ডেটা লিখতে সক্ষম হবেন (বিদ্যমান -০-সেকেন্ডের ডিফল্ট সর্বাধিক প্রয়োগের সময় সাপেক্ষে)। আপনি এখনই এগুলি ব্যবহার
গ্রিগরি

মোংগোডিবি 4.2 এখন বিতরণ লেনদেনের সম্পূর্ণ সমর্থন সহ জিএ। mongodb.com/blog/post/…
গ্রিগোরি মেলনিক

83

লেনদেন ছাড়াই বেঁচে থাকা

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

সুতরাং MongoDBলেনদেনের ঘাটতি কাটিয়ে উঠতে আমাদের গ্রহণযোগ্যতাগুলি কী কী ?

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

Update, findAndModify, $addToSet(একটি আপডেট মধ্যে) & $push(একটি আপডেট মধ্যে) অপারেশন একটি একক নথি মধ্যে atomically কাজ করে।


2
আমি এই উত্তরটি যেভাবে পছন্দ করি তা পছন্দ করে, আমাদের জিজ্ঞাসা চালিয়ে যাওয়ার পরিবর্তে যদি আমাদের রিলেশনাল ডিবিতে ফিরে যেতে হয় তবে। ধন্যবাদ @ xameeramir!
DonnyTian

3
কোডের একটি সমালোচনা বিভাগ কাজ করবে না যদি আপনার 1 টির বেশি সার্ভার থাকে তবে আপনাকে একটি বাহ্যিক বিতরণ লকিং পরিষেবা ব্যবহার করতে হবে
আলেকজান্ডার মিলস

@ আলেকজান্ডারমিলস দয়া করে বিস্তারিত বর্ণনা করতে পারেন?
জমির

উত্তরগুলি এখানে থেকে ভিডিও প্রতিলিপি বলে মনে হচ্ছে: youtube.com/watch?v=_Iz5xLZr8Lw
ফ্রিটজ

আমি মনে করি যতক্ষণ না আমাদের একক সংগ্রহে পরিচালিত হওয়া সীমাবদ্ধ থাকে ততক্ষণ এটি ঠিক আছে fine তবে আমরা বিবিধ কারণে (ডক আকার বা আপনি যদি রেফারেন্স ব্যবহার করে থাকেন) কারণে একক দস্তাবেজে সবকিছু রাখতে পারি না। আমি মনে করি তখন আমাদের লেনদেনের প্রয়োজন হতে পারে।
ব্যবহারকারী 2488286

24

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


@ জিওভান্নি বিটলাইনার টোকুয়েটক তখন থেকে পেরকোনা দ্বারা অধিগ্রহণ করা হয়েছে, এবং আপনি যে লিঙ্কটি দিয়েছেন তাতে পোস্টের পরে যা কিছু ঘটেছে তার কোনও তথ্যই আমি পাইনি see তাদের চেষ্টায় কী ঘটেছিল জানেন? আমি খুঁজে পেতে সেই পৃষ্ঠাতে ইমেল ঠিকানা ইমেল করেছি।
টাইলার কলিয়ার

আপনার বিশেষভাবে কী দরকার? আপনার যদি মংডোব-তে টুটু প্রযুক্তি প্রয়োগ করা হয় তবে github.com/Tokutek/mongo ব্যবহার করে দেখুন , যদি আপনার মাইএসকিএল সংস্করণ প্রয়োজন হয় তবে তারা এটি তাদের
মাইএসকিএল

আমি কীভাবে নোডেজ দিয়ে টোকুটেককে একত্রিত করতে পারি।
মনোজ সঞ্জীবওয়া

11

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


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

1
NoSQL সমাধান খুব কমই একা ব্যবহৃত হয়। ডকুমেন্ট স্টোরগুলি (মঙ্গো এবং পালঙ্ক) সম্ভবত এই নিয়ম থেকে একমাত্র অব্যাহতি।
করলি হরভাথ

7

এখন তাতে সমস্যা কী? মঙ্গোডিবি কেবলমাত্র একটি নথিতে পারমাণবিক আপডেট করতে পারে। পূর্বের প্রবাহে এমনটি ঘটতে পারে যে কোনও ধরণের ত্রুটি প্রবেশ করে এবং বার্তাটি ডাটাবেসে সঞ্চিত হয়ে যায় তবে ব্যবহারকারীর ভারসাম্য হ্রাস হয় না এবং / অথবা লেনদেন লগ হয় না।

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

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


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

9
সত্য নয়, আপনি চূড়ান্ত প্রতিশ্রুতি না দিলে লেনদেনের দোকানগুলি আবার ফিরে আসবে।
করলি হরভাথ

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

@ নাগি আমি হ্যাঁ, আমি এটাই বোঝাতে চাইছি স্কেলিবিলিটি স্বাচ্ছন্দ্যের জন্য একজনকে লেনদেনের সুবিধাগুলি বাণিজ্য করতে হবে। মূলত অ্যাপ্লিকেশনটিকে আশা করা উচিত যে বিভিন্ন সংগ্রহের যে কোনও দুটি নথিই অসঙ্গতিপূর্ণ অবস্থায় থাকতে পারে এবং এটি পরিচালনা করতে প্রস্তুত থাকতে পারে be @ আইআইএইচ এটি রোলব্যাক করবে তবে রাজ্যটি আর আসল হবে না (বার্তা সম্পর্কিত তথ্য হারিয়ে যাবে)। এটি কেবল আংশিক ডেটা থাকার চেয়ে বেশি ভাল নয় (যেমন ভারসাম্য হ্রাস হয়েছে তবে কোনও বার্তা সম্পর্কিত তথ্য নেই বা বিপরীতে)।
pingw33n

আমি দেখি. এটি আসলে কোনও সহজ বাধা নয়। আরডিবিএমএস সিস্টেমগুলি কীভাবে লেনদেন করে সে সম্পর্কে আমার আরও শিখতে হবে। আপনি কি এমন কোনও অনলাইন উপাদান বা বইয়ের প্রস্তাব দিতে পারেন যেখানে আমি এগুলি পড়তে পারি?
নাগিআই

6

প্রকল্পটি সহজ, তবে আপনাকে অর্থ প্রদানের জন্য লেনদেনকে সমর্থন করতে হবে, যা পুরো জিনিসটিকে কঠিন করে তোলে। সুতরাং, উদাহরণস্বরূপ, শত শত সংগ্রহ (ফোরাম, চ্যাট, বিজ্ঞাপন, ইত্যাদি ...) সহ একটি জটিল পোর্টাল সিস্টেমটি কিছুটা বিবেচনায় সহজ, কারণ আপনি যদি কোনও ফোরাম বা চ্যাট এন্ট্রি হারিয়ে ফেলেন তবে কেউই সত্যিই চিন্তা করে না। আপনি যদি অন্যদিকে, অর্থ প্রদানের লেনদেন হারাতে চান তবে এটি একটি গুরুতর সমস্যা issue

সুতরাং, আপনি যদি সত্যিই মঙ্গোডিবি-র জন্য একটি পাইলট প্রকল্প চান, তবে সেই ক্ষেত্রে একটি নির্বাচন করুন যা সেই বিষয়ে সহজ ।


ব্যাখ্যা করার জন্য আপনাকে ধন্যবাদ। শুনে দুঃখ হল। আমি নোএসকিউএল এর সরলতা এবং জেএসএন এর ব্যবহার পছন্দ করি। আমরা ওআরএমের বিকল্পের সন্ধান করছি তবে মনে হচ্ছে আমাদের এটির জন্য কিছু সময়ের জন্য আটকে থাকতে হবে।
নাগিআই

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

আমি বলিনি যে মঙ্গোডিবি এসকিউএল এর চেয়ে ভাল। এটি কেবল এসকিউএল + ওআরএম এর চেয়ে ভাল কিনা তা আমরা জানতে চাই। তবে এখন এটি স্পষ্ট হয়ে উঠেছে যে তারা এই জাতীয় প্রকল্পে প্রতিযোগিতামূলক নয়।
নাগিআই

6

বৈধ কারণে মোঙ্গোডিবিতে লেনদেনগুলি অনুপস্থিত। এটি মোঙ্গোডিবিকে দ্রুততর করে তোলে things

আপনার ক্ষেত্রে, যদি লেনদেন করা আবশ্যক হয় তবে মঙ্গো ভাল মানায় না।

আরডিএমবিএস + মোংগোডিবি হতে পারে তবে এটি জটিলতা যুক্ত করবে এবং অ্যাপ্লিকেশন পরিচালনা এবং সমর্থন করা আরও কঠিন করে তুলবে।


1
টোকুএমএক্স নামে মঙ্গোডিবি'র বিতরণ এখন রয়েছে যা 50x পারফরম্যান্স উন্নতি করতে ফ্র্যাক্টাল প্রযুক্তি ব্যবহার করে এবং একই সাথে পুরো এসিডি
ওসিডিএভ

9
কোনও লেনদেন কীভাবে কখনই "আবশ্যক" হতে পারে না। যত তাড়াতাড়ি আপনার 1 টি সাধারণ কেসের প্রয়োজন হবে যেখানে আপনাকে 2 টি টেবিলগুলি আপডেট করতে হবে মঙ্গো হঠাৎ কী আর ভাল ফিট নেই? এটি মোটেও অনেকগুলি ব্যবহারের কেস ছেড়ে যায় না।
মিস্টার_ই

1
@ মিঃ_আমি একমত, এ কারণেই মঙ্গোডিবি করুণ বোবা :)
আলেকজান্ডার মিলস

6

মোংডব্বের জন্য বৈশিষ্ট্যটির মতো লেনদেন বাস্তবায়নের বিষয়ে এটি সম্ভবত সেরা ব্লগ found

সিঙ্ক ফ্ল্যাগ: মাস্টার ডকুমেন্ট থেকে কেবলমাত্র অনুলিপি করার জন্য সেরা

কাজের সারি: খুব সাধারণ উদ্দেশ্য, 95% কেস সমাধান করে। বেশিরভাগ সিস্টেমে যেকোন উপায়ে কমপক্ষে একটি কাজের সারি থাকা দরকার!

দুই ধাপের প্রতিশ্রুতি: এই কৌশলটি নিশ্চিত করে যে প্রতিটি সত্তার কাছে সর্বদা সুসংগত অবস্থায় যাওয়ার জন্য প্রয়োজনীয় সমস্ত তথ্য রয়েছে

লগ পুনর্মিলন: আর্থিক ব্যবস্থার জন্য আদর্শ সবচেয়ে শক্তিশালী কৌশল

সংস্করণ: বিচ্ছিন্নতা সরবরাহ করে এবং জটিল কাঠামো সমর্থন করে

আরও তথ্যের জন্য এটি পড়ুন: https://dzone.com/articles/how-implement-robust- এবং


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

পরামর্শের জন্য @ মেসকে ধন্যবাদ
বৈভব

4

এটি দেরিতে হলেও ভাবি এটি ভবিষ্যতে সহায়তা করবে। এই সমস্যাটি সমাধান করার জন্য আমি রেডিসকে একটি সারি তৈরি করার জন্য ব্যবহার করি ।

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

  • কিভাবে একটি কিউ সাহায্য আপনি
    নিশ্চিত করুন যে মাঝে প্রত্যেক ব্লক কোড করা কিউ lock()এবং release()অনেক ফাংশন একই সময় হিসাবে চলবে না, তাদের বিছিন্ন করা।

    function action1() {
      phase1();
      queue.lock("action_domain");
      phase2();
      phase3();
      queue.release("action_domain");
    }
    
    function action2() {
      phase1();
      queue.lock("action_domain");
      phase2();
      queue.release("action_domain");
    }
  • কীভাবে একটি সারি তৈরি করা যায়
    আমি ব্যাকএন্ড সাইটে কোনও সারি তৈরি করার সময় রেস কনডিটন অংশটি কীভাবে এড়ানো যায় তার উপর আমি কেবল দৃষ্টি নিবদ্ধ করব । আপনি যদি সারিটির প্রাথমিক ধারণাটি না জানেন তবে এখানে আসুন ।
    নীচের কোডগুলি কেবল ধারণাটি দেখায়, আপনাকে সঠিক উপায়ে প্রয়োগ করতে হবে।

    function lock() {
      if(isRunning()) {
        addIsolateCodeToQueue(); //use callback, delegate, function pointer... depend on your language
      } else {
        setStateToRunning();
        pickOneAndExecute();
      }
    }
    
    function release() {
      setStateToRelease();
      pickOneAndExecute();
    }

তবে আপনার isRunning() setStateToRelease() setStateToRunning()নিজেরটি আলাদা করতে হবে অন্যথায় আপনি আবার জাতি শর্তের মুখোমুখি। এই কাজের জন্য আমি Redis চয়ন ACID উদ্দেশ্য এবং আকার পরিবর্তনযোগ্য।
Redis ডকুমেন্ট এটি সম্পর্কে কথা লেনদেন আছে:

লেনদেনের সমস্ত কমান্ড ক্রমিকভাবে ক্রমিকভাবে সম্পাদিত হয়। এটি কখনও ঘটতে পারে না যে অন্য ক্লায়েন্টের দ্বারা জারি করা একটি অনুরোধ একটি রেডিস লেনদেনের কার্যকর করার মাঝখানে পরিবেশিত হয়। এটি গ্যারান্টি দেয় যে কমান্ডগুলি একক বিচ্ছিন্ন অপারেশন হিসাবে কার্যকর করা হয়।

পি / এস:
আমি রেডিস ব্যবহার করি কারণ আমার পরিষেবাটি ইতিমধ্যে এটি ব্যবহার করেছে, আপনি এটি করতে অন্য যে কোনও উপায়ে সমর্থন বিচ্ছিন্নতা ব্যবহার করতে পারেন। আমার কোড জন্য যখন আপনি ব্যবহারকারীর একজন ব্যবহারকারী ব্লক কর্ম 2 কেবলমাত্র কর্ম 1 কল প্রয়োজন, অন্যান্য ব্যবহারকারীর ব্লক করবেন না উপরে। ধারণাটি প্রতিটি ব্যবহারকারীর লকের জন্য একটি অনন্য কী রাখা হয়।
action_domain


আপনার স্কোর ইতিমধ্যে আরও বেশি হলে আপনি আরও বেশি পরিমাণে আপত্তি পেয়েছেন। এখানে বেশিরভাগই মনে করেন। আপনার উত্তর প্রশ্নের প্রসঙ্গে কার্যকর। আমি তোমাকে উজ্জীবিত করেছি
মুকুস

3

লেনদেনগুলি এখন মঙ্গোডিবি ৪.০ এ উপলব্ধ। নমুনা এখানে

// Runs the txnFunc and retries if TransientTransactionError encountered

function runTransactionWithRetry(txnFunc, session) {
    while (true) {
        try {
            txnFunc(session);  // performs transaction
            break;
        } catch (error) {
            // If transient error, retry the whole transaction
            if ( error.hasOwnProperty("errorLabels") && error.errorLabels.includes("TransientTransactionError")  ) {
                print("TransientTransactionError, retrying transaction ...");
                continue;
            } else {
                throw error;
            }
        }
    }
}

// Retries commit if UnknownTransactionCommitResult encountered

function commitWithRetry(session) {
    while (true) {
        try {
            session.commitTransaction(); // Uses write concern set at transaction start.
            print("Transaction committed.");
            break;
        } catch (error) {
            // Can retry commit
            if (error.hasOwnProperty("errorLabels") && error.errorLabels.includes("UnknownTransactionCommitResult") ) {
                print("UnknownTransactionCommitResult, retrying commit operation ...");
                continue;
            } else {
                print("Error during commit ...");
                throw error;
            }
       }
    }
}

// Updates two collections in a transactions

function updateEmployeeInfo(session) {
    employeesCollection = session.getDatabase("hr").employees;
    eventsCollection = session.getDatabase("reporting").events;

    session.startTransaction( { readConcern: { level: "snapshot" }, writeConcern: { w: "majority" } } );

    try{
        employeesCollection.updateOne( { employee: 3 }, { $set: { status: "Inactive" } } );
        eventsCollection.insertOne( { employee: 3, status: { new: "Inactive", old: "Active" } } );
    } catch (error) {
        print("Caught exception during transaction, aborting.");
        session.abortTransaction();
        throw error;
    }

    commitWithRetry(session);
}

// Start a session.
session = db.getMongo().startSession( { mode: "primary" } );

try{
   runTransactionWithRetry(updateEmployeeInfo, session);
} catch (error) {
   // Do something with error
} finally {
   session.endSession();
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.