সংক্ষিপ্ত উত্তরটি হ'ল কেবল নতুন ডেটা কেবল তারের মাধ্যমে প্রেরণ হয়। এখানে কিভাবে এটা কাজ করে.
মেটিওর সার্ভারের তিনটি গুরুত্বপূর্ণ অংশ রয়েছে যা সাবস্ক্রিপশন পরিচালনা করে: প্রকাশের ফাংশন , সাবস্ক্রিপশনটি কী ডেটা সরবরাহ করে তা যুক্তির সংজ্ঞা দেয়; মোঙ্গো চালক , যা পরিবর্তনের জন্য ডাটাবেসের ঘড়ির; এবং মার্জ বাক্স , যা ক্লায়েন্টের সমস্ত সক্রিয় সাবস্ক্রিপশনগুলির সাথে একত্রিত হয় এবং তাদের ক্লায়েন্টকে নেটওয়ার্কের বাইরে প্রেরণ করে।
ফাংশন প্রকাশ করুন
প্রতিবার কোনও উল্কা ক্লায়েন্ট কোনও সংগ্রহে সাবস্ক্রাইব করে, সার্ভার একটি প্রকাশিত ফাংশন চালায়
। প্রকাশ ফাংশনের কাজ হ'ল নথিগুলির সেটটি নির্ধারণ করা যা এর ক্লায়েন্টের থাকা উচিত এবং প্রতিটি নথির সম্পত্তি মার্জ বাক্সে প্রেরণ করা। এটি প্রতিটি নতুন সাবস্ক্রাইব ক্লায়েন্টের জন্য একবার চালায়। আপনি যেকোন জাভাস্ক্রিপ্ট প্রকাশের ফাংশনে রাখতে পারেন যেমন যথেচ্ছভাবে জটিল অ্যাক্সেস নিয়ন্ত্রণ ব্যবহার করে this.userId। প্রকাশ ফাংশন কল করে একত্রীকরণ বাক্সে ডেটা পাঠায় this.added, this.changedএবং
this.removed। দেখুন
পূর্ণ ডকুমেন্টেশন প্রকাশ আরো বিস্তারিত জানার জন্য।
যদিও বেশিরভাগ প্রকাশিত ফাংশনগুলিকে নিম্ন-স্তরের added, changedএবং removedএপিআই -এর সাথে ঘৃণা করতে হবে না
। একটি ফাংশন আয় একটি মোঙ্গো কার্সার প্রকাশ পারেন, উল্কা সার্ভার স্বয়ংক্রিয়ভাবে মোঙ্গো ড্রাইভার (আউটপুট সংযোগ insert, updateএবং removedএকত্রীকরণ বাক্সের ইনপুট callbacks) ( this.added, this.changedএবং this.removed)। এটি বেশ ঝরঝরে যে আপনি কোনও প্রকাশনা ফাংশনে সমস্ত অনুমতি পরীক্ষা করে নিতে পারেন এবং তারপরে কোনও ব্যবহারকারীর কোড ছাড়াই ডাটাবেস ড্রাইভারটিকে সরাসরি মার্জ বাক্সে সংযুক্ত করতে পারেন। এবং যখন অটোপলিশ চালু হয়, তখনও এই সামান্য কিছুটা লুকানো থাকে: সার্ভারটি স্বয়ংক্রিয়ভাবে প্রতিটি সংগ্রহের সমস্ত নথির জন্য একটি কোয়েরি সেট করে এবং সেগুলি মার্জ বাক্সে ঠেলা দেয়।
অন্যদিকে, আপনি ডাটাবেস অনুসন্ধানগুলি প্রকাশের মধ্যে সীমাবদ্ধ নন। উদাহরণস্বরূপ, আপনি এমন একটি প্রকাশিত ফাংশন লিখতে পারেন যা কোনও এর অভ্যন্তরে কোনও ডিভাইস থেকে জিপিএস পজিশন পড়তে পারে Meteor.setInterval, বা অন্য ওয়েব পরিষেবা থেকে একটি উত্তরাধিকার সূত্রে পুনরায় পোস্ট করুন API সেই ক্ষেত্রে, আপনি নিম্ন স্তরের কল করে একত্রীকরণ বক্স পরিবর্তন নির্গত চাই added, changedএবং removedDDP API- টি।
মঙ্গো ড্রাইভার
মোঙ্গো ড্রাইভারের কাজ লাইভ প্রশ্নের পরিবর্তনের জন্য মোঙ্গো ডাটাবেসের দেখার জায়গা। এই প্রশ্নের ক্রমাগত চালাতে এবং কল করে ফলাফল পরিবর্তন আপডেট আসতে added, removedএবং changedcallbacks।
মঙ্গো কোনও আসল সময়ের ডাটাবেস নয়। সুতরাং ড্রাইভার পোল। এটি প্রতিটি সক্রিয় লাইভ ক্যোয়ারির জন্য শেষ ক্যোয়ারী ফলাফলের একটি মেমরি অনুলিপি রাখে। প্রতিটি পোলিং চক্র, এটি পূর্ববর্তী সংরক্ষিত ফলাফল নিয়ে নতুন ফলাফল তুলনা, কম্পিউটিং ন্যূনতম সেট added, removedএবং changed
ঘটনা পার্থক্য বর্ণনা। যদি একাধিক কলার একই লাইভ ক্যোয়ারির জন্য কলব্যাকগুলি নিবন্ধভুক্ত করে, ড্রাইভার কেবল একই ফলাফলের সাথে প্রতিটি নিবন্ধিত কলব্যাককে কল করে ক্যোয়ারীর একটি অনুলিপি দেখে।
সার্ভারটি যখনই কোনও সংগ্রহ আপডেট করে, ড্রাইভার সেই সংগ্রহের প্রতিটি লাইভ ক্যোয়ারিকে পুনরায় গণনা করে (উল্টোর ভবিষ্যতের সংস্করণগুলি সীমাবদ্ধকরণের জন্য একটি স্কেলিং এপিআই প্রকাশ করবে যা আপডেটে পুনরুদ্ধারগুলি পুনরায় গণনা করে)) ড্রাইভারটি প্রতিটি লাইভ ক্যোয়ারিকে 10 সেকেন্ড টাইমারে পোলও করে ls আউট-অফ-ব্যান্ড ডাটাবেস আপডেটগুলি মেটাওর সার্ভারকে বাইপাস করে।
মার্জ বক্স
কাজ একত্রীকরণ বক্স ফলাফল (একত্রিত হয় added, changedএবং removed
একটি একক তথ্য প্রবাহ মধ্যে একটি ক্লায়েন্টের সক্রিয় ফাংশন প্রকাশ সমস্ত কল)। প্রতিটি সংযুক্ত ক্লায়েন্টের জন্য একটি একত্রীকরণ বাক্স রয়েছে। এটিতে ক্লায়েন্টের মিনিমোঙ্গো ক্যাশেটির একটি সম্পূর্ণ অনুলিপি রয়েছে।
কেবলমাত্র একটি একক সাবস্ক্রিপশন সহ আপনার উদাহরণে, মার্জ বাক্সটি মূলত একটি পাস-মাধ্যমে is তবে আরও জটিল অ্যাপের একাধিক সাবস্ক্রিপশন থাকতে পারে যা ওভারল্যাপ হতে পারে। যদি দুটি সাবস্ক্রিপশন উভয় একই দস্তাবেজে একই বৈশিষ্ট্য নির্ধারণ করে তবে মার্জ বাক্সটি সিদ্ধান্ত নেয় যে কোন মানটি অগ্রাধিকার নেয় এবং কেবল এটি ক্লায়েন্টকে প্রেরণ করে। সাবস্ক্রিপশন অগ্রাধিকার সেট করার জন্য আমরা এখনও API উন্মুক্ত করিনি। আপাতত, ক্লায়েন্টটি ডেটা সেটে সাবস্ক্রাইব করে ক্রম দ্বারা অগ্রাধিকারটি নির্ধারিত হয়। ক্লায়েন্টের প্রথম সাবস্ক্রিপশনটির সর্বোচ্চ অগ্রাধিকার থাকে, দ্বিতীয় সাবস্ক্রিপশন পরবর্তী সর্বোচ্চ হয় এবং এ জাতীয় কিছু।
কেননা মার্জ বক্সটি ক্লায়েন্টের রাজ্য ধারণ করে, এটি প্রতিটি ক্লায়েন্টকে টু ডেট রাখার জন্য সর্বনিম্ন পরিমাণের ডেটা প্রেরণ করতে পারে, কোনও প্রকাশনা ফাংশনই তা খাওয়ায় তা বিবেচনা করে না।
একটি আপডেটে কি ঘটে
সুতরাং এখন আমরা আপনার দৃশ্যের জন্য মঞ্চ নির্ধারণ করেছি।
আমাদের 1000 টি সংযুক্ত ক্লায়েন্ট রয়েছে। প্রত্যেকে একই লাইভ মঙ্গো ক্যোয়ারিতে সাবস্ক্রাইব করা হয়েছে ( Somestuff.find({}))। যেহেতু প্রতিটি ক্লায়েন্টের জন্য ক্যোয়ারি একই, তাই ড্রাইভারটি কেবল একটি লাইভ কোয়েরি চালাচ্ছে। সক্রিয় মার্জ বাক্সে রয়েছে 1,000 এবং প্রতিটি ক্লায়েন্টের প্রকাশনা ফাংশনটি একটি added, changedএবং
removedসেই লাইভ কোয়েরিতে নিবন্ধিত হয়েছে যা মার্জ বাক্সগুলির মধ্যে একটিতে ফিড করে। মার্জ বাক্সগুলির সাথে অন্য কোনও কিছু সংযুক্ত নেই।
প্রথমে মঙ্গো ড্রাইভার। যখন ক্লায়েন্টগুলির মধ্যে একটিতে একটি নতুন দস্তাবেজ সন্নিবেশ করানো হয় Somestuff, তখন এটি পুনরুদ্ধারকে ট্রিগার করে। মঙ্গো ড্রাইভার সমস্ত নথির জন্য ক্যোয়ারী পুনরায় চালু করে Somestuff, ফলাফলটিকে স্মৃতিতে পূর্ববর্তী ফলাফলের সাথে তুলনা করে, একটি নতুন নথি রয়েছে বলে খুঁজে পেয়েছে এবং এক হাজারে নিবন্ধিত insertকলব্যাকের প্রত্যেকটিকে কল করে ।
এর পরে, প্রকাশিত ফাংশনগুলি। এখানে খুব সামান্যই ঘটছে: 1,000 টি insertকলব্যাকের প্রত্যেকটি কল করে ডিলিট করা বাক্সে ডেটা ঠেলে দেয় added।
অবশেষে, প্রতিটি মার্জ বাক্স তার ক্লায়েন্টের ক্যাশে থাকা মেমরি অনুলিপিটির বিরুদ্ধে এই নতুন বৈশিষ্ট্যগুলি পরীক্ষা করে। প্রতিটি ক্ষেত্রে, এটি সন্ধান করে যে মানগুলি এখনও ক্লায়েন্টের উপরে নেই এবং বিদ্যমান মানটিকে ছায়া দেয় না। সুতরাং মার্জ বাক্সটি DATAতার ক্লায়েন্টের সাথে সোকজেএস সংযোগে একটি ডিডিপি বার্তা প্রেরণ করে এবং এর সার্ভার-সাইড ইন-মেমরি অনুলিপিটি আপডেট করে।
মোট সিপিইউ ব্যয় হ'ল একটি মঙ্গো ক্যোয়ারিকে আলাদা করার জন্য খরচ, পাশাপাশি তাদের ক্লায়েন্টদের রাজ্য পরীক্ষা করে নেওয়া এবং একটি নতুন ডিডিপি বার্তা পেইলড তৈরির জন্য 1000 মার্জ বাক্সের ব্যয়। কেবলমাত্র ডাটা যা তারের উপর দিয়ে প্রবাহিত হয় তা হল 1000 টি ক্লায়েন্টের প্রত্যেককে একক JSON অবজেক্ট, ডাটাবেসে নতুন নথির সাথে সম্পর্কিত, এবং ক্লায়েন্টের কাছ থেকে সার্ভারে একটি আরপিসি বার্তা যা মূল সন্নিবেশ তৈরি করেছিল।
নিখুঁতকরণ
আমরা অবশ্যই যা পরিকল্পনা করেছি তা এখানে।
আরও দক্ষ মোঙ্গো চালক। আমরা
0.5.1 সালে ড্রাইভারকে অনুকূলিত করেছি
কেবলমাত্র পৃথক ক্যোয়ারী অনুসারে একটি একক পর্যবেক্ষক চালাতে।
প্রতিটি ডিবি পরিবর্তনের জন্যই কোনও ক্যোয়ারের পুনর্বিবেচনা ট্রিগার করা উচিত নয়। আমরা কিছু স্বয়ংক্রিয় উন্নতি করতে পারি, তবে সর্বোত্তম পদ্ধতির মধ্যে এমন একটি এপিআই যা বিকাশকারীকে নির্দিষ্ট করতে দেয় যে কোন প্রশ্নগুলি পুনরায় চালু করতে হবে। উদাহরণস্বরূপ, এটি কোনও বিকাশকারীদের কাছে স্পষ্ট যে একটি চ্যাটরুমে একটি বার্তা সন্নিবেশ করানো দ্বিতীয় ঘরে থাকা বার্তাগুলির জন্য একটি লাইভ ক্যোয়ারীটিকে অবৈধ করা উচিত নয়।
মঙ্গো ড্রাইভার, প্রকাশনার ফাংশন এবং মার্জ বাক্সের একই প্রক্রিয়াতে বা এমনকি একই মেশিনে চালানোর দরকার নেই। কিছু অ্যাপ্লিকেশন জটিল লাইভ ক্যোয়ারি চালায় এবং ডাটাবেস দেখার জন্য আরও সিপিইউ প্রয়োজন। অন্যের কাছে কেবল কয়েকটি স্বতন্ত্র প্রশ্ন রয়েছে (একটি ব্লগ ইঞ্জিনটি কল্পনা করুন), তবে সম্ভবত অনেক সংযুক্ত ক্লায়েন্ট রয়েছে - মার্জ বাক্সগুলির জন্য এগুলির আরও সিপিইউ প্রয়োজন। এই উপাদানগুলি পৃথক করা আমাদের প্রতিটি টুকরা স্বাধীনভাবে স্কেল করতে দেয়।
অনেকগুলি ডাটাবেস সারি আপডেট করা হলে পুরানো এবং নতুন সারি সরবরাহ করে fire এই বৈশিষ্ট্যটি সহ, একটি ডাটাবেস ড্রাইভার পরিবর্তনের জন্য ভোট দেওয়ার পরিবর্তে একটি ট্রিগার নিবন্ধন করতে পারে।