একটি স্কেলেবল নোটিফিকেশন সিস্টেম কীভাবে ডিজাইন করবেন? [বন্ধ]


32

আমার একটি নোটিফিকেশন সিস্টেম ম্যানেজার লিখতে হবে।

আমার প্রয়োজনীয়তা এখানে:

আমার বিভিন্ন প্ল্যাটফর্মগুলিতে একটি বিজ্ঞপ্তি পাঠাতে সক্ষম হতে হবে, যা সম্পূর্ণ আলাদা হতে পারে (উদাহরণস্বরূপ, আমাকে কোনও এসএমএস বা কোনও ইমেল প্রেরণে সক্ষম হতে হবে)।

কখনও কখনও প্রদত্ত প্ল্যাটফর্মের জন্য সমস্ত প্রাপকদের জন্য বিজ্ঞপ্তিটি একই হতে পারে তবে কখনও কখনও এটি প্রতি প্ল্যাটফর্মের জন্য প্রাপকদের (বা বেশ কয়েকটি) জন্য একটি বিজ্ঞপ্তি হতে পারে।

প্রতিটি বিজ্ঞপ্তিতে প্ল্যাটফর্ম নির্দিষ্ট পেড থাকতে পারে (উদাহরণস্বরূপ কোনও এমএমএসে একটি শব্দ বা একটি চিত্র থাকতে পারে)।

সিস্টেমটি স্কেলেবল হতে হবে , আমার অ্যাপ্লিকেশন বা সার্ভারকে ক্রাশ না করে প্রচুর পরিমাণে বিজ্ঞপ্তি পাঠাতে সক্ষম হতে হবে।

এটি একটি দুই ধাপের প্রক্রিয়া, প্রথমে কোনও গ্রাহক কোনও বার্তা টাইপ করতে পারে এবং প্রেরণের জন্য একটি প্ল্যাটফর্ম চয়ন করতে পারে এবং বিজ্ঞপ্তিটি গুলি বাস্তবসম্মত প্রক্রিয়া করার জন্য তৈরি করা উচিত হয় পরে হয়।

তারপরে সিস্টেমটিকে প্ল্যাটফর্ম সরবরাহকারীর কাছে বিজ্ঞপ্তি প্রেরণ করা দরকার।


আপাতত, যদিও আমি কিছুটা শেষ করেছি তবে আমি জানি না এটি কতটা স্কেলযোগ্য হবে বা এটি যদি একটি ভাল নকশা হয়।

আমি যদিও নিম্নলিখিত বিষয়গুলি (ছদ্ম ভাষায়) করেছি:

একটি জেনেরিক Notificationবস্তু:

class Notification {
    String                 $message;
    Payload                $payload;
    Collection<Recipient>  $recipients;
}

নিম্নলিখিত বিষয়বস্তুগুলির সাথে সমস্যাটি কি আমি যদি 1.000.000 প্রাপকদের পেয়ে থাকি? এমনকি যদি Recipientবস্তুটি খুব ছোট হয় তবে এটি খুব বেশি স্মৃতি গ্রহণ করবে।

আমি প্রাপক প্রতি একটি বিজ্ঞপ্তিও তৈরি করতে পারতাম, তবে কিছু প্ল্যাটফর্ম সরবরাহকারীদের এটি ব্যাচে প্রেরণ করা প্রয়োজন, যার অর্থ বেশ কয়েকটি প্রাপকদের সাথে আমার একটি বিজ্ঞপ্তি সংজ্ঞায়িত করা দরকার।

প্রতিটি তৈরি বিজ্ঞপ্তি ডিবি বা রেডিসের মতো অবিরাম স্টোরেজে সংরক্ষণ করা যেতে পারে।

এটি পরিমাপযোগ্য কিনা তা নিশ্চিত করার জন্য এটি পরে একত্রিত করা ভাল কি হবে?

দ্বিতীয় ধাপে, আমার এই বিজ্ঞপ্তিটি প্রক্রিয়া করা দরকার।

তবে আমি কীভাবে সঠিক প্ল্যাটফর্ম সরবরাহকারীটির বিজ্ঞপ্তিটি আলাদা করতে পারি?

আমি একটি MMSNotificationপ্রসারিত করার মত একটি জিনিস ব্যবহার করা উচিত abstract Notification? নাকি এরকম কিছু Notification.setType('MMS')?

একই সাথে প্রচুর বিজ্ঞপ্তি প্রক্রিয়াকরণের অনুমতি দেওয়ার জন্য, আমি মনে করি রাব্বিটএমকিউয়ের মতো একটি মেসেজিং কাতার সিস্টেম সঠিক সরঞ্জাম হতে পারে। তাই কি?

এটি আমাকে প্রচুর নোটিফিকেশন সারি করার অনুমতি দেয় এবং বিজ্ঞপ্তিটি পপ করতে এবং তাদের প্রক্রিয়া করার জন্য বেশ কিছু কর্মী রাখে। তবে উপরের মত আমাকে প্রাপকদের ব্যাচ করার দরকার আছে কি?

তারপরে আমি এমন কোনও NotificationProcessorবস্তুর কল্পনা করি যার জন্য আমি NotificationHandlerপ্রতিটি যুক্ত করতে পারি NotificationHandlerপ্ল্যাটফর্ম সরবরাহকারীর সাথে সংযোগ স্থাপন এবং বিজ্ঞপ্তি সম্পাদনের দায়িত্বে।

EventManagerপ্লাগেবল আচরণের অনুমতি দেওয়ার জন্য আমি একটি ব্যবহার করতে পারি ।

কোন প্রতিক্রিয়া বা ধারণা?

আপনার সময় দেওয়ার জন্য ধন্যবাদ।

দ্রষ্টব্য: আমি পিএইচপি-তে কাজ করতে অভ্যস্ত এবং এটি সম্ভবত আমার পছন্দের ভাষা।


সম্পাদনা করুন (মরফুনিয়ালের উত্তর অনুসারে)

  • আপনি প্রতি সেকেন্ডে কয়টি বার্তা প্রেরণ করছেন (বর্তমান / প্রাথমিক স্তরগুলি নির্ধারণ করুন, সিস্টেমটি পুনরায় নকশাকৃত হওয়ার আগে পরিচালনা করা উচিত এমন একটি সর্বাধিক স্তর নির্ধারণ করুন)
  • সিস্টেমে কী হার্ডওয়্যার সীমাবদ্ধতা রয়েছে (সিস্টেমে মেমরি, সিপিইউ ইত্যাদি উপলব্ধ রয়েছে)
  • কীভাবে হার্ডওয়্যার স্কেল হবে (যেমন, আরও সার্ভার যুক্ত করা, ক্লাউড কম্পিউটিং ইত্যাদি)

  • কোন ভাষা / সিস্টেমগুলি বিজ্ঞপ্তি উত্পন্ন করবে?

এটি আমার নিজের, আমি প্রোগ্রামিকভাবে বিজ্ঞপ্তি তৈরি করার দায়িত্বে আছি তবে একটি ইউআই থেকে তৈরি করেছি।

  • জেনারেটর কি বার্তাটির প্রাপকদের (?) জানে বা তারা অন্য কোনও উপায়ে সরবরাহ করেছে (যেমন, নির্দিষ্ট সতর্কতার ধরণের ব্যবসায়ের নিয়মগুলি নির্দিষ্ট প্রাপকদের কাছে যায়)

নির্দিষ্ট প্রাপকদের, প্রাপকদের একটি দল (উদাহরণস্বরূপ ট্যাগ সিস্টেম ব্যবহার করে) বা পুরো প্ল্যাটফর্মের জন্য একটি বিজ্ঞপ্তি তৈরি করা সম্ভব।

  • সিসি / বিসিসি / পঠন রসিদ যুক্ত করার জন্য কি ব্যবসায়ের নিয়ম রয়েছে?

হ্যাঁ। মনে রাখবেন যে এটি সত্যই প্ল্যাটফর্ম নির্দিষ্ট এবং সমস্ত প্ল্যাটফর্মগুলিতে পঠন বা সিসি উপলভ্য নয়।

  • জেনারেটর কী বার্তা প্রেরণ করছে (যেমন, এসএমএস / ইমেল) তা জানে বা এটি প্রাপকের ভিত্তিতে রয়েছে

এটি প্রাপকের উপর ভিত্তি করে তৈরি করা হয়েছে, যদিও গ্রহীতা প্ল্যাটফর্ম সম্পর্কিত, এবং প্ল্যাটফর্মগুলির ডেটা পরিচালনা করার বিভিন্ন উপায় রয়েছে, ইউআই সম্ভবত চিত্রগুলি, একটি শব্দ বা কিছু সেট আপ করার অনুমতি দেওয়ার জন্য প্ল্যাটফর্ম নির্দিষ্ট হতে পারে likely

  • জেনারেটরের কি বার্তাগুলি প্রেরণ / প্রাপ্ত / পঠনের নিশ্চয়তা প্রয়োজন (অ্যাসিঙ্ক বনাম সিঙ্ক্রোনাস প্রেরণ)

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

  • বার্তা উত্স / প্রাপকদের একটি ইতিহাস সংরক্ষণ করার প্রয়োজনীয়তা রয়েছে (কত দিন?)

হ্যাঁ, আমরা সম্ভবত কিছু পরিসংখ্যান তৈরি করতে এবং প্রতিবেদন করতে চাই। * বিজ্ঞপ্তি শেষ পয়েন্টগুলি সংজ্ঞায়িত করুন


  • বার্তা প্রেরণে কোন পরিষেবাগুলি ব্যবহার করা হচ্ছে? নির্ভর করে, কিছুগুলি ধ্রুপদী আরএসটি ওয়েব সার্ভিস, অন্যটি কিছু বিদেশী প্রোটোকল, এটি সরবরাহকারীর পক্ষে সত্য really

  • কি প্রতিক্রিয়া / নিশ্চিতকরণ সরবরাহ করা হয় (সিঙ্ক / async)

নির্ভর করে, কিছু সিঙ্ক্রোনাস এবং একটি ত্রুটির সাথে জবাব দেয় যখন কিছু অন্যকে ত্রুটিগুলি পরীক্ষা করার জন্য পরে টানতে হবে।

  • এটি কি নতুন প্রান্ত-পয়েন্ট যুক্ত করার সম্ভাবনা রয়েছে [এমনকি তা হলেও, এটি কি বিমূর্ত করাও প্রয়োজন]

হ্যাঁ, আসলে, আমাদের অ্যাপ্লিকেশনটি বাড়ছে এবং আমরা সম্ভবত নতুন সরবরাহকারী যুক্ত করতে সক্ষম হতে চাই তবে এটি প্রতি বছর 1 বা 2 এর মতো অনুপাত something


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

প্রশ্ন জিজ্ঞাসা করুন কিন্তু প্রশ্ন করবেন না! :) হ্যাঁ, মাঝে মাঝে আমিও মোডগুলির মানসিকতা অনুধাবন করতে ব্যর্থ হই।
মিচিফ

upvotes এবং ভিউগুলি দেখায় যে এই প্রশ্নটি কতটা প্রাসঙ্গিক .... যদি কেবল মডারেটররা বুঝতে পারতেন !!!
NoobEditor

রাবিটএমকিউ ব্যবহার করা এই সমস্যার সঠিক পন্থা। আমার বিআইজি সংস্থার একটি সাক্ষাত্কারে আমাকে খুব অনুরূপ সমস্যা জিজ্ঞাসা করা হয়েছিল এবং আমি সেরা ফল্ট সহিষ্ণু প্রকাশক / গ্রাহক প্যাটার্নের সাথে লড়াই করে যাচ্ছিলাম। শেষে আমাকে সঠিক উত্তরটি বলা হয়েছিল। RabbitMQ। দেখে মনে হচ্ছে তারা এটি ব্যবহার করে সমস্যার সমাধান করেছে। আশা করি এইটি কাজ করবে!!!
আকদ

উত্তর:


16

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

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

  • আপনি প্রতি সেকেন্ডে কয়টি বার্তা প্রেরণ করছেন (বর্তমান / প্রাথমিক স্তরগুলি নির্ধারণ করুন, সিস্টেমটি পুনরায় নকশাকৃত হওয়ার আগে পরিচালনা করা উচিত এমন একটি সর্বাধিক স্তর নির্ধারণ করুন)
  • সিস্টেমে কী হার্ডওয়্যার সীমাবদ্ধতা রয়েছে (সিস্টেমে মেমরি, সিপিইউ ইত্যাদি উপলব্ধ রয়েছে)
  • কীভাবে হার্ডওয়্যার স্কেল হবে (যেমন, আরও সার্ভার যুক্ত করা, ক্লাউড কম্পিউটিং ইত্যাদি)

এখন আপনি যে উপায়টি অতিক্রম করেছেন, সিস্টেম ডিজাইন / আর্কিটেকচার আপনার অ-কার্যকরী প্রয়োজনীয়তা পূরণে সক্ষম কিনা তা নিশ্চিত করতে আপনি কয়েকটি পরীক্ষা করতে পারেন ।

বিজ্ঞপ্তি / বার্তাগুলি প্রেরণের ব্যবসায়িক / ক্রিয়ামূলক প্রয়োজনীয়তার জন্য, নিম্নলিখিত সূত্রগুলি সহায়তা করতে পারে (আপনি যদি আরও উত্তর সরবরাহ করেন তবে আমি এই উত্তরে যুক্ত করতে পারি):

বিজ্ঞপ্তি উত্স সংজ্ঞায়িত করুন

  • কোন ভাষা / সিস্টেমগুলি বিজ্ঞপ্তি উত্পন্ন করবে
  • জেনারেটর কি বার্তাটির প্রাপকদের (?) জানে বা তারা অন্য কোনও উপায়ে সরবরাহ করেছে (যেমন, নির্দিষ্ট সতর্কতার ধরণের ব্যবসায়ের নিয়মগুলি নির্দিষ্ট প্রাপকদের কাছে যায়)
  • সিসি / বিসিসি / পঠন রসিদ যুক্ত করার জন্য কি ব্যবসায়ের নিয়ম রয়েছে?
  • জেনারেটর কী বার্তা প্রেরণ করছে (যেমন, এসএমএস / ইমেল) তা জানে বা এটি প্রাপকের ভিত্তিতে রয়েছে
  • জেনারেটরের কি বার্তাগুলি প্রেরণ / প্রাপ্ত / পঠনের নিশ্চয়তা প্রয়োজন (অ্যাসিঙ্ক বনাম সিঙ্ক্রোনাস প্রেরণ)
  • বার্তা উত্স / প্রাপকদের একটি ইতিহাস সংরক্ষণ করার প্রয়োজনীয়তা রয়েছে (কত দিন?)

বিজ্ঞপ্তি শেষ পয়েন্টগুলি সংজ্ঞায়িত করুন

  • বার্তা প্রেরণে কোন পরিষেবাগুলি ব্যবহার করা হচ্ছে
  • কি প্রতিক্রিয়া / নিশ্চিতকরণ সরবরাহ করা হয় (সিঙ্ক / async)
  • এটি কি নতুন প্রান্ত-পয়েন্ট যুক্ত করার সম্ভাবনা রয়েছে [এমনকি তা হলেও, এটি কি বিমূর্ত করাও প্রয়োজন]

আমি একটি কংক্রিট আর্কিটেকচার উদাহরণ প্রদান করতে দ্বিধা বোধ করি কারণ এটি জড়িত উপাদানগুলির উপর নির্ভর করে ভারী নির্ভর করবে; তবে প্রায়শই সরল বার্তা সিস্টেমগুলির মধ্যে মেমরি / অ্যাপ্লিকেশন, নন-এসকিউএল, ডিস্ক বা রিলেশনাল ডেটাবেস কোনও মৌলিক সারি জড়িত। তারপরে একটি পৃথক প্রক্রিয়া (বা বিতরণ করা হলে কয়েকটি পৃথক প্রক্রিয়া) তাদের বার্তার প্রকারের জন্য [যেমন একটি ক্রোন জব] কাতারে পোল করতে পারে; এবং প্রয়োজনীয় হিসাবে প্রেরণ।

এই বার্তাটি অবিলম্বে প্রেরণের প্রয়োজন হলে কিছু ধাক্কা-ভিত্তিক কৌশলগুলি (যেমন PostgreSQL বিজ্ঞপ্তি / তালিকা) ব্যবহার করে এটি বাড়ানো যেতে পারে।

একটি সহজ কাতারের সুবিধাটি হ'ল বার্তাটি উত্পন্ন করার সিস্টেমটির খুব কম কাজ আছে এবং হার্ডওয়্যার / পারফরম্যান্স প্রয়োজনীয়তার উপর ভিত্তি করে প্রসেসিং সিস্টেমটি ভারসাম্যপূর্ণ হতে পারে।


আপনার বিশদ উত্তরের জন্য আপনাকে অনেক ধন্যবাদ যা আসলে আমাকে কিছু পরিষ্কার ধারণা পেতে সহায়তা করে। আপনার উত্থাপিত প্রশ্নের উত্তর দিতে আমি আমার উত্তর সম্পাদনা করেছি।
ট্রেন্ট

-2

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

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