সংক্ষিপ্তসার : প্রায় 1 মিলিয়ন সক্রিয় ব্যবহারকারী এবং 150 মিলিয়ন সঞ্চিত ক্রিয়াকলাপের জন্য, আমি এটিকে সহজ রাখি:
- অনন্য ক্রিয়াকলাপের স্টোরেজ করার জন্য একটি রিলেশনাল ডাটাবেস ব্যবহার করুন (ক্রিয়াকলাপে 1 টি রেকর্ড / "যে জিনিসটি ঘটেছে") রেকর্ডগুলি যতটা সম্ভব কমপ্যাক্ট করুন। কাঠামো যাতে আপনি ক্রিয়াকলাপ আইডি দ্বারা বা সময়ের সীমাবদ্ধতার সাথে বন্ধু আইডির সেট ব্যবহার করে ক্রিয়াকলাপগুলির একটি ব্যাচটি দ্রুত দখল করতে পারেন।
- ক্রিয়াকলাপ আইডিগুলি রেডিসে প্রকাশ করুন যখনই কোনও ক্রিয়াকলাপ রেকর্ড তৈরি হয়, আইডিটিকে "ক্রিয়াকলাপ স্ট্রিম" তালিকার সাথে যুক্ত করে এমন প্রতিটি ব্যবহারকারীর জন্য যে ক্রিয়াকলাপটি দেখতে পাওয়া উচিত বন্ধু / গ্রাহক list
যে কোনও ব্যবহারকারীর জন্য ক্রিয়াকলাপ স্ট্রিম পেতে কোয়েরি রেডিস এবং তারপরে প্রয়োজনীয় তথ্য হিসাবে ডিবি থেকে হস্তান্তর করুন। সময়মতো ব্যবহারকারীকে ব্রাউজ করা দরকার হলে সময়ে ডিবি জিজ্ঞাসা করতে ফিরে যান (যদি আপনি এটিও সরবরাহ করেন)
প্রায় 15 মিলিয়ন ক্রিয়াকলাপ মোকাবেলার জন্য আমি একটি সাধারণ পুরানো মাইএসকিউএল টেবিল ব্যবহার করি।
এটি দেখতে এমন কিছু দেখাচ্ছে:
id
user_id (int)
activity_type (tinyint)
source_id (int)
parent_id (int)
parent_type (tinyint)
time (datetime but a smaller type like int would be better)
activity_type
আমাকে ক্রিয়াকলাপের প্রকারটি source_id
বলে , ক্রিয়াকলাপ সম্পর্কিত বলে রেকর্ডটি আমাকে বলে। সুতরাং যদি ক্রিয়াকলাপের ধরণটি "যোগ করা প্রিয়" এর অর্থ হয় তবে আমি জানি যে উত্স_আইডি একটি প্রিয় রেকর্ডের আইডি বোঝায়।
parent_id
/ parent_type
আমার app এর জন্য দরকারী - তারা আমাকে বল কি কার্যকলাপ সাথে সম্পর্কিত হয়। যদি কোনও বই পছন্দসই হয়, তবে প্যারেন্ট_আইডি / পিতামাতাই টাইপ আমাকে বলবে যে ক্রিয়াকলাপ একটি প্রদত্ত প্রাথমিক কী (আইডি) সহ একটি বই (টাইপ) এর সাথে সম্পর্কিত
আমি তালিকাবদ্ধ (user_id, time)
এবং যে ক্রিয়াকলাপগুলির জন্য জিজ্ঞাসা করি user_id IN (...friends...) AND time > some-cutoff-point
। আইডিটি খনন করা এবং একটি পৃথক ক্লাস্টারড সূচক নির্বাচন করা ভাল ধারণা হতে পারে - আমি এটি নিয়ে পরীক্ষা নিরীক্ষা করিনি।
খুব বেসিক স্টাফ, তবে এটি কাজ করে, এটি সহজ এবং আপনার প্রয়োজনীয়তা যেমন পরিবর্তন হয় তেমনি এটি কাজ করা সহজ। এছাড়াও, আপনি যদি মাইএসকিউএল ব্যবহার না করে থাকেন তবে আপনি আরও ভাল সূচক-ভিত্তিতে করতে সক্ষম হবেন।
সর্বাধিক সাম্প্রতিক ক্রিয়াকলাপগুলিতে দ্রুত অ্যাক্সেসের জন্য, আমি রেডিসের সাথে পরীক্ষামূলক । রেডিস এর সমস্ত ডেটা মেমোরিতে সঞ্চয় করে, তাই আপনি নিজের সমস্ত কার্যক্রম সেখানে রাখতে পারবেন না, তবে আপনি আপনার সাইটে বেশিরভাগ হিট স্ক্রিনের জন্য পর্যাপ্ত পরিমাণে সঞ্চয় করতে পারেন। প্রতিটি ব্যবহারকারীর জন্য সর্বাধিক সাম্প্রতিক 100 বা এর মতো কিছু। মিশ্রণে রেডিসের সাথে, এটি এটির মতো কাজ করতে পারে:
- আপনার মাইএসকিউএল ক্রিয়াকলাপ রেকর্ড তৈরি করুন
- যে ক্রিয়াকলাপটি তৈরি করেছেন তাদের প্রতিটি বন্ধুর জন্য, রেডিসে তাদের ক্রিয়াকলাপের তালিকায় আইডি টিপুন।
- সর্বশেষ এক্স আইটেম প্রতিটি তালিকা ছাঁটাই
রেডিস দ্রুত এবং এটি একটি সংযোগ জুড়ে পাইপলাইন কমান্ডগুলির একটি উপায় সরবরাহ করে - তাই 1000 টি বন্ধুদের জন্য একটি ক্রিয়াকলাপ ঠেলে মিলিসেকেন্ড লাগে।
আমি যা বলছি তার আরও বিশদ ব্যাখ্যার জন্য রেডিসের টুইটার উদাহরণ দেখুন: http://redis.io/topics/twitter-clone
ফেব্রুয়ারী 2011 আপডেট করুন আমি এই মুহুর্তে 50 মিলিয়ন সক্রিয় ক্রিয়াকলাপ পেয়েছি এবং আমি কোনও কিছুই পরিবর্তন করি নি। এর অনুরূপ কিছু করার জন্য একটি দুর্দান্ত জিনিস হ'ল এটি কমপ্যাক্ট, ছোট সারি ব্যবহার করে। আমি এমন কিছু পরিবর্তন আনার পরিকল্পনা করছি যা আরও অনেক ক্রিয়াকলাপ এবং সেই ক্রিয়াকলাপের আরও প্রশ্ন জড়িত এবং আমি স্পষ্টতই জিনিসগুলিকে দ্রুত রাখতে রেডিস ব্যবহার করব। আমি অন্যান্য ক্ষেত্রগুলিতে রেডিস ব্যবহার করছি এবং এটি নির্দিষ্ট ধরণের সমস্যার জন্য সত্যই ভাল কাজ করে।
জুলাই 2014 আপডেট করুন আমরা প্রায় 700K মাসিক সক্রিয় ব্যবহারকারী রয়েছি। গত কয়েক বছর ধরে আমি প্রতিটি ব্যবহারকারীর জন্য শেষ 1000 ক্রিয়াকলাপ আইডি সংরক্ষণের জন্য রেডিস (বুলেটযুক্ত তালিকায় বর্ণিত) ব্যবহার করছি। সিস্টেমে সাধারণত প্রায় 100 মিলিয়ন ক্রিয়াকলাপ রেকর্ড থাকে এবং এগুলি এখনও মাইএসকিউএলে সংরক্ষণ করা হয় এবং এখনও একই লেআউট হয়। এই রেকর্ডগুলি আমাদের কম রেডিস মেমোরি নিয়ে দূরে সরে যায়, তারা ক্রিয়াকলাপের ডেটা রেকর্ড হিসাবে পরিবেশন করে, এবং ব্যবহারকারীদের যদি কিছু খুঁজে পাওয়ার জন্য সময় মতো আরও পৃষ্ঠার প্রয়োজন হয় তবে আমরা সেগুলি ব্যবহার করি।
এটি কোনও চালাক বা বিশেষত আকর্ষণীয় সমাধান ছিল না তবে এটি আমাকে ভালভাবে পরিবেশন করেছে।