একটি বিজ্ঞপ্তি সিস্টেম তৈরি করা [বন্ধ]


170

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

সুতরাং ... কিছু প্রয়োজনীয়তা যা আমাদের রয়েছে:

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

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

এই পদ্ধতির সাথে আমি যে বিষয়গুলি নিয়ে উদ্বিগ্ন সেগুলি:

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

তাহলে আমার প্রস্তাবিত সমাধান এবং আমার উদ্বেগগুলি সম্পর্কে আপনি কী ভাবেন? দয়া করে মন্তব্য করুন যদি আপনার মনে হয় যে এখানে প্রাসঙ্গিক কিছু হতে পারে আমার কিছু উল্লেখ করা উচিত।

ওহ, আমরা আমাদের পৃষ্ঠার জন্য পিএইচপি ব্যবহার করছি, তবে এখানে আমি মনে করি এটি একটি বড় কারণ হওয়া উচিত নয়।


একজন ব্যক্তির প্রচেষ্টা হিসাবে এই বিজ্ঞপ্তি সিস্টেমটি তৈরি করতে আপনাকে কত সময় লেগেছে। আমি কেবল সেই অনুযায়ী সময়রেখার জন্য একটি অনুমান করতে চাই।
শাহরিয়ার

@ শাহরিয়ার আমি মনে করি এটি প্রজ্ঞাপন সিস্টেমের জটিলতার উপর নির্ভর করে।
tyan

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

উত্তর:


168

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

╔═════════════╗      ╔═══════════════════╗      ╔════════════════════╗
║notification ║      ║notification_object║      ║notification_change ║
╟─────────────╢      ╟───────────────────╢      ╟────────────────────╢
║ID           ║—1:n—→║ID                 ║—1:n—→║ID                  ║
║userID       ║      ║notificationID     ║      ║notificationObjectID║
╚═════════════╝      ║object             ║      ║verb                ║
                     ╚═══════════════════╝      ║actor               ║
                                                ╚════════════════════╝

(যেখানে আপনি উপযুক্ত দেখেন সেখানে ক্ষেত্র যুক্ত করুন)

এটি মূলত প্রতি বস্তু পরিবর্তনের গোষ্ঠীকরণের জন্য, যাতে আপনি "আপনার কাছে 3 বন্ধু অনুরোধ রয়েছে" বলতে পারেন। এবং অভিনেতার প্রতি গ্রুপিং দরকারী, যাতে আপনি বলতে পারেন "ব্যবহারকারী জেমস বন্ড আপনার বিছানায় পরিবর্তন করেছে"। এটি আপনার পছন্দ মত বিজ্ঞপ্তিগুলি অনুবাদ ও গণনা করার ক্ষমতাও দেয়।

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

যেহেতু বিজ্ঞপ্তিগুলি সাইটের ব্যবহারকারীর জন্য রিয়েলটাইমের কাছাকাছি, তাই পরিবর্তনগুলি যুক্ত হওয়ার সাথে সাথে আমি তাদের নোডেজ + ওয়েবসকেট ক্লায়েন্টের সাথে পিএইচপি পুশিং আপডেট দিয়ে সমস্ত শ্রোতাদের নোডেজগুলিতে আপডেট করব change


1
নোটিফিকেশন_অবজেক্ট.অবজেক্ট পরিবর্তনের
ধরণটি

2
এটি মূ question় প্রশ্ন হতে পারে তবে ব্যবহারকারীরা বিজ্ঞপ্তিটি দেখে বা অভিনয় করার পরে আপনি কী করবেন এই সেট আপটি দিয়ে? আপনি কি কেবল এটি ডাটাবেস থেকে সরিয়েছেন বা বিজ্ঞপ্তি তৈরি হওয়ার পর থেকে ব্যবহারকারী লগ ইন করেছেন কিনা তা দেখার জন্য কেবল তারিখগুলি ব্যবহার করেন?
জেফারি মিলস

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

3
@ জেফারিমিলস আপনি টেবিলের মতো একটি স্ট্যাটাস ফিল্ড রাখতে পারেন is_notification_readএবং notificationএটি থাকলে যথাযথভাবে চিহ্নিত করতে পারেন unread, readবা deleted
কেভিন

2
আমি এই সমাধানের কিছু দিক বুঝতেও সংগ্রাম করেছি এবং এ সম্পর্কে একটি পৃথক প্রশ্ন করেছি: dba.stackexchange.com/questions/99401/…
ইউজার 45623

27

এটি সত্যিই একটি বিমূর্ত প্রশ্ন, সুতরাং আমি অনুমান করি যে আপনার কী করা উচিত বা করা উচিত নয় তা উল্লেখ করার পরিবর্তে আমরা কেবল এটি নিয়ে আলোচনা করব।

আপনার উদ্বেগ সম্পর্কে আমি যা মনে করি তা এখানে:

  • হ্যাঁ, একটি বিজ্ঞপ্তি সিস্টেম জটিল তবে যদিও এটি নরক নয়। এ জাতীয় সিস্টেমগুলির মডেলিং এবং প্রয়োগের ক্ষেত্রে আপনার অনেকগুলি ভিন্ন দৃষ্টিভঙ্গি থাকতে পারে এবং এগুলি মাঝারি থেকে উচ্চতর স্তরের জটিলতার মধ্যে থাকতে পারে;

  • ব্যক্তিগতভাবে, আমি সর্বদা স্টাফ ডাটাবেস-চালিত করার চেষ্টা করি। কেন? যেহেতু যা চলছে তার পুরো নিয়ন্ত্রণের আমি গ্যারান্টি দিতে পারি - তবে এটি কেবল আমি, আপনি একটি ডাটাবেস-চালিত পদ্ধতির ছাড়াই নিয়ন্ত্রণ রাখতে পারেন; বিশ্বাস করুন, আপনি এই ক্ষেত্রে নিয়ন্ত্রণ চাইবেন;

  • আমাকে আপনার জন্য একটি বাস্তব কেস উদাহরণ দিয়ে দিন, যাতে আপনি কোথাও থেকে শুরু করতে পারেন। গত এক বছরে আমি কোনও ধরণের সামাজিক নেটওয়ার্কে একটি বিজ্ঞপ্তি সিস্টেমের মডেলিং এবং প্রয়োগ করেছি (অবশ্যই ফেসবুকের মতো নয়)। আমি কীভাবে সেখানে বিজ্ঞপ্তিগুলি সঞ্চয় করতাম? আমার একটি notificationsটেবিল ছিল , যেখানে আমি generator_user_id(বিজ্ঞপ্তিটি প্রস্তুতকারী ব্যবহারকারীর আইডি), target_user_id(ধরণের স্পষ্টতাই, তাই না?), notification_type_id(বিজ্ঞপ্তির ধরণের সাথে আলাদা আলাদা টেবিলে রেফারেন্স করা ) রেখেছি এবং সমস্ত ছিল আমাদের প্রয়োজনীয় টেবিলগুলি আমাদের টেবিলগুলি পূরণ করতে হবে (টাইমস্ট্যাম্পগুলি, পতাকাগুলি ইত্যাদি)। আমার notification_typesটেবিলটির কোনও notification_templatesটেবিলের সাথে সম্পর্ক ছিল , যা প্রতিটি ধরণের বিজ্ঞপ্তির জন্য নির্দিষ্ট টেম্পলেট সংরক্ষণ করে। উদাহরণস্বরূপ, আমার একটি POST_REPLYটাইপ ছিল , এটির মতো একটি টেম্পলেট ছিল {USER} HAS REPLIED ONE OF YOUR #POSTS। সেখান থেকে, আমি কেবল চিকিত্সা করেছি{}একটি পরিবর্তনশীল হিসাবে এবং #একটি রেফারেন্স লিঙ্ক হিসাবে;

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

আমি যে মডেলটি তৈরি করেছি তা হ'ল অবশ্যই আপনি অনুসরণ করতে পারেন এমনটি নয়, সেরাও নয়। আমি আশা করি আমার উত্তর অন্ততপক্ষে আপনাকে সঠিক পথে অনুসরণ করবে।


কেন অন্য কিছু ডেটা স্টোরের সাথে আমার নিয়ন্ত্রণ থাকবে না?
জান হানিয়ে

ঠিক আছে, আমি এটা বলিনি। আমি যা বলেছিলাম তা হ'ল আমি কেবল একটি ডাটাবেস-চালিত পদ্ধতির সাহায্যে ডেটা নিয়ন্ত্রণের গ্যারান্টি দিতে পারি; তবে আমি শুধু আমি তা পুনরায় বলব।
ড্যানিয়েল রিবেইরো

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

ড্যানিয়েল রিবেইরো @ আশিষ শুক্লার অনুরোধ অনুসারে আপনি স্থানধারককে কীভাবে প্রতিস্থাপন করেছেন
টুপে

@ আশিষশুকলা আপনি কি স্থানধারক ব্যবহার করেছেন বা প্রতিস্থাপন করেছেন এবং কীভাবে?
শান্তারাম টুপে

8
╔════════════════════╗
║notification        ║
╟────────────────────╢
║Username            ║
║Object              ║
║verb                ║
║actor               ║
║isRead              ║
╚════════════════════╝

এটি 2 টি সংগ্রহের চেয়ে ভাল উত্তর বলে মনে হচ্ছে। নতুন ইভেন্টগুলি পেতে আপনি ব্যবহারকারীর নাম, অবজেক্ট এবং আইড্রেডের মাধ্যমে জিজ্ঞাসা করতে পারেন (যেমন 3 টি মুলতুবি বন্ধুর অনুরোধ, 4 টি প্রশ্ন জিজ্ঞাসা করা ইত্যাদি ...)

এই স্কিমাতে সমস্যা আছে কিনা তা আমাকে জানান।


3
শীর্ষের উত্তরটি একটি সাধারণীকরণ করা ডেটা স্ট্রাকচার ব্যবহার করে, যার অর্থ টেবিলগুলিতে কোনও অতিরিক্ত কাজ নয়। আপনার উত্তর কি তা করে?
হারুন হলের

4

আমি স্বীকৃত উত্তরের জন্য ব্যক্তিগতভাবে ডায়াগ্রামটি খুব ভালভাবে বুঝতে পারি না, সুতরাং আমি গ্রহণযোগ্য উত্তর এবং অন্যান্য পৃষ্ঠাগুলি থেকে কী শিখতে পারি তার উপর একটি ডাটাবেস চিত্র চিত্রটি সংযুক্ত করতে যাচ্ছি।

এখানে চিত্র বর্ণনা লিখুন

উন্নতিগুলি ভালভাবে গৃহীত হয়েছে।


ম্যাসেজ_প্লেস্টের মতো মনে হয় নোটিফিকেশন টাইপ সারণীতে থাকবে। এছাড়াও মনে হচ্ছে যে মূল_আরএল বিজ্ঞপ্তি টেবিলের মধ্যে থাকবে, তবে আপনি বিজ্ঞপ্তি_ম্যাসেজ সারণীটি সরিয়ে ফেলতে পারেন। আপনি নিজের কারণে নোটিফিকেশনমেসেজ টেবিলের কারণ ব্যাখ্যা করতে পারেন?
জেফ রায়ান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.