কীভাবে একটি সামাজিক নেটওয়ার্কে ক্রিয়াকলাপ স্ট্রিম কার্যকর করা যায়


140

আমি আমার নিজস্ব সামাজিক নেটওয়ার্ক বিকাশ করছি এবং ব্যবহারকারীর ক্রিয়া প্রবাহ প্রয়োগের ওয়েব উদাহরণগুলিতে আমি খুঁজে পাইনি ... উদাহরণস্বরূপ, প্রতিটি ব্যবহারকারীর জন্য ক্রিয়াগুলি কীভাবে ফিল্টার করা যায়? অ্যাকশন ইভেন্টগুলি কীভাবে সংরক্ষণ করবেন? ক্রিয়া প্রবাহের জন্য এবং নিজের ক্রিয়াগুলির জন্য আমি কোন ডেটা মডেল এবং অবজেক্ট মডেলটি ব্যবহার করতে পারি?


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

1
স্ট্রিম ফ্রেমওয়ার্কটি সর্বাধিক ব্যবহৃত সমাধান: github.com/tschellenbach/Stream-Framework এছাড়াও প্যাকেজগুলির এই তালিকাটি দেখুন: djangopackages.com/grids/g/ activities
থিয়েরি

1
ব্যক্তিগতকরণের ক্ষেত্রে এটি বিশ্লেষণ এবং মেশিন লার্নিংয়ের উপর ভিত্তি করে, gettream.io/personalization দেখুন
থিয়েরি

উত্তর:


241

সংক্ষিপ্তসার : প্রায় 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 মিলিয়ন ক্রিয়াকলাপ রেকর্ড থাকে এবং এগুলি এখনও মাইএসকিউএলে সংরক্ষণ করা হয় এবং এখনও একই লেআউট হয়। এই রেকর্ডগুলি আমাদের কম রেডিস মেমোরি নিয়ে দূরে সরে যায়, তারা ক্রিয়াকলাপের ডেটা রেকর্ড হিসাবে পরিবেশন করে, এবং ব্যবহারকারীদের যদি কিছু খুঁজে পাওয়ার জন্য সময় মতো আরও পৃষ্ঠার প্রয়োজন হয় তবে আমরা সেগুলি ব্যবহার করি।

এটি কোনও চালাক বা বিশেষত আকর্ষণীয় সমাধান ছিল না তবে এটি আমাকে ভালভাবে পরিবেশন করেছে।


2
রেডিসের জন্য +1। ভি 2 ভার্চুয়াল মেমোরি ব্যবহার করে তাই
রেডিসের

16
যদি ক্রিয়াকলাপের একাধিক উত্স থাকে (যোগ করুন, মন্তব্য করুন, পছন্দ করুন ইত্যাদি), আপনি কীভাবে এই টেবিলটিতে আসল ক্রিয়াকলাপগুলিতে যোগদান করবেন? আপনি কি একাধিক বাম জোড় ব্যবহার করেন (প্রতিটি কার্যকলাপের টেবিলের জন্য)?
আলী শাকিবা

1
@ কেসি @ জনস এর প্রশ্ন প্রতিধ্বনি করছে - আপনি JOINবিভিন্ন activity_typeটেবিলে কীভাবে সম্পাদন করবেন ? সেগুলি কি ব্যয়বহুল পারফরম্যান্স অনুযায়ী যুক্ত হবে?
রব সোবার্স

1
"যোগদান" সম্পর্কে কেউ কি জনস প্রশ্নের উত্তর পেয়েছে? যে কোনও লিঙ্কটি যেখানে ব্যাখ্যা করা যেতে পারে সেখানে পোস্ট করতে পারেন? আমাকে অনুরূপ কাজ করতে হবে এবং এটি আমার পক্ষে খুব সহায়ক হবে।
ওয়াসিম

3
যোগ দেয় না activity_typeআপনার প্রয়োজন অন্য ডেটা পেতে অনন্য প্রতি এক ক্যোয়ারী ।
ছাড়িয়ে গেছে

21

এটি MySQL ব্যবহার করে একটি ক্রিয়াকলাপ স্ট্রিমের বাস্তবায়ন। ক্রিয়াকলাপ, অ্যাক্টিভিটিফিড, গ্রাহক: তিনটি শ্রেণি রয়েছে।

ক্রিয়াকলাপ কোনও ক্রিয়াকলাপের প্রবেশের প্রতিনিধিত্ব করে এবং এর টেবিলটি দেখতে এমন দেখাচ্ছে:

id
subject_id
object_id
type
verb
data
time

Subject_idক্রিয়া সম্পাদন করা অবজেক্টের object_idআইডি, ক্রিয়া গ্রহণকারী বস্তুর আইডি। typeএবং verbএই ক্রিয়াটি নিজেই বর্ণনা করে (উদাহরণস্বরূপ, কোনও ব্যবহারকারী যদি কোনও নিবন্ধে একটি মন্তব্য যুক্ত করেন তবে তারা যথাক্রমে "মন্তব্য" এবং "তৈরি" হবে) যোগদান করতে না পারার জন্য ডেটাতে অতিরিক্ত ডেটা থাকে (উদাহরণস্বরূপ, এতে বিষয়টির নাম থাকতে পারে এবং উপাধি, নিবন্ধ শিরোনাম এবং url, মন্তব্য বডি ইত্যাদি)।

প্রতিটি ক্রিয়াকলাপ এক বা একাধিক ক্রিয়াকলাপের অন্তর্ভুক্ত এবং এগুলি দেখতে এমন একটি টেবিলের সাথে সম্পর্কিত:

feed_name
activity_id

আমার আবেদনে আমার প্রতিটি ব্যবহারকারীর জন্য একটি করে ফিড এবং প্রতিটি আইটেমের জন্য একটি ফিড (সাধারণত ব্লগ নিবন্ধগুলি) থাকে তবে তারা যা খুশি তা হতে পারে।

একজন গ্রাহক সাধারণত আপনার সাইটের একজন ব্যবহারকারী, তবে এটি আপনার অবজেক্ট মডেলটিতে কোনও বস্তুও হতে পারে (উদাহরণস্বরূপ একটি নিবন্ধ তার স্রষ্টার ফিড_অ্যাকশনটিতে সাবস্ক্রাইব হতে পারে)।

প্রতিটি গ্রাহক এক বা একাধিক অ্যাক্টিভিটি ফিডের অন্তর্ভুক্ত এবং উপরের মতো তারাও এই জাতীয় লিঙ্ক টেবিলের সাথে সম্পর্কিত:

feed_name
subscriber_id
reason

reasonক্ষেত্র এখানে ব্যাখ্যা দিয়েছে কেন গ্রাহক ফিড সদস্যতা নিয়েছে। উদাহরণস্বরূপ, যদি কোনও ব্যবহারকারী কোনও ব্লগ পোস্ট বুকমার্ক করে তবে কারণটি 'বুকমার্ক'। এটি পরে ব্যবহারকারীদের বিজ্ঞপ্তিগুলির জন্য ফিল্টারিং ক্রিয়ায় আমাকে সহায়তা করে।

কোনও গ্রাহকের ক্রিয়াকলাপ পুনরুদ্ধার করতে, আমি তিনটি টেবিলের একটি সহজ যোগদান করি। যোগদানটি দ্রুত, কারণ আমি WHEREএখন দেখতে দেখতে এমন একটি শর্তের জন্য কয়েকটি কার্যকলাপ নির্বাচন করি - time > some hours। কার্যকলাপের সারণীতে ডেটা ক্ষেত্রের জন্য ধন্যবাদ দিয়ে আমি অন্য যোগদানগুলিকে এড়িয়ে চলি।

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


নিকোলো মার্টিনি আমি ক্রিয়াকলাপে উত্তর মন্তব্য যুক্ত করতে এবং এটির অধীনে এটি প্রদর্শন করতে চেয়েছিলাম, আপনার কাঠামোর সাথে এটি কীভাবে সম্ভব? আমি কি অন্য টেবিল যুক্ত করব বা কেবল একই ব্যবহার করব, যদি একই হয় তবে আপনার পরামর্শগুলি কী?
বাসিত

এই বাস্তবায়নটির কার্যকারিতা কেমন? বড় টেবিলে কোনও পরীক্ষা?
জোশুয়া এফ। রাউন্ট্রি

16

ক্রিয়াকলাপের স্ট্রিমের জন্য একটি বর্তমান ফর্ম্যাট রয়েছে যা বেশ কিছু চেনা লোকদের দ্বারা তৈরি করা হয়েছে।

http://activitystrea.ms/

মূলত, প্রতিটি ক্রিয়াকলাপে একজন অভিনেতা (যিনি ক্রিয়াকলাপটি সম্পাদন করেন), একটি ক্রিয়া (ক্রিয়াকলাপের ক্রিয়া), একটি বস্তু (যার উপর অভিনেতা অভিনয় করে) এবং একটি লক্ষ্য থাকে।

উদাহরণস্বরূপ: ম্যাক্স অ্যাডামের দেয়ালের একটি লিঙ্ক পোস্ট করেছেন।

তাদের JSON এর স্পেস লেখার সময় 1.0 সংস্করণে পৌঁছেছে, যা আপনি প্রয়োগ করতে পারেন এমন কার্যকলাপের প্যাটার্নটি দেখায়।

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


হাই @ সানট্রান আমি জানি এই পোস্টটি বহু বছর আগে ছিল, তবে ক্রিয়াকলাপ প্রবাহ সম্পর্কে আমার আরও একটি প্রশ্ন আছে have আপনি সাহায্য করতে পারেন এমন কোন উপায় আছে?
hiswendy

অবশ্যই। আপনার প্রশ্ন কি?
সান ট্রান-এনগুইন

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

13

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

  1. RabbitMQ
  2. অ্যাপাচি কিউপিড

আরও দেখুন প্রশ্ন কি একটা সামাজিক ক্রিয়াকলাপ প্রবাহ বাস্তবায়ন শ্রেষ্ঠ পদ্ধতিতে কি?


1

আপনার একেবারে একটি পারফরম্যান্ট এবং বিতরণ করা বার্তার সারি দরকার। তবে এটি এখানেই শেষ হয় না, আপনাকে কী ধ্রুবক ডেটা সংরক্ষণ করতে হবে এবং কোনটি ক্ষণস্থায়ী এবং কী হবে ইত্যাদি সম্পর্কে সিদ্ধান্ত নিতে হবে you'll

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

http://blog.linkedin.com/2011/01/11/open-source-linkedin-kafka/

http://incubator.apache.org/kafka/index.html


0

নিজের রোলিংয়ের পরিবর্তে, আপনি কোনও API এর মাধ্যমে ব্যবহৃত তৃতীয় পক্ষের পরিষেবাতে সন্ধান করতে পারেন। আমি কোলাবিনেট ( http://www.collabinate.com ) নামে একটি শুরু করেছি যার একটি গ্রাফ ডাটাবেস ব্যাকএন্ড এবং একটি উচ্চতর সাম্প্রতিক, উচ্চ কার্যকারিতা পদ্ধতিতে প্রচুর পরিমাণে ডেটা হ্যান্ডেল করার জন্য কিছুটা মোটামুটি পরিশীলিত অ্যালগরিদম রয়েছে। যদিও এতে ফেসবুক বা টুইটারের মত কার্যকারিতাটির প্রস্থতা নেই, তবে বেশিরভাগ ক্ষেত্রেই আপনাকে অ্যাপ্লিকেশনটিতে ক্রিয়াকলাপ স্ট্রিম, সামাজিক ফিড বা মাইক্রোব্লগিং কার্যকারিতা তৈরি করতে হবে এমন ক্ষেত্রে ব্যবহারের ক্ষেত্রে যথেষ্ট পরিমাণ নেই।

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