রিয়েলটাইম-ভারী ওয়েবসকেট-ভিত্তিক ওয়েব অ্যাপ্লিকেশনটি কীভাবে আর্কিটেকচার করবেন?


17

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

সুনির্দিষ্ট হয়ে ওঠার আগে, কিছুটা প্রসঙ্গ:

  • ওয়েব অ্যাপ একটি রিয়েলটাইম এসপিএ;
  • ব্যাকএন্ড রিল অন রুবেলে আছে। রিয়েলটাইম ইভেন্টগুলি রুবি দ্বারা একটি রেডিস কীতে ঠেলে দেওয়া হয়, তারপরে একটি মাইক্রো নোড সার্ভার এটিকে পিছনে টেনে সকেট.আইওতে ঠেলে দেয়;
  • সম্মুখভাগটি AngularJS- এ রয়েছে এবং সরাসরি নোডের সকেট.আইও সার্ভারের সাথে সংযুক্ত হয়।

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

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

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

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

আপনি কি নিশ্চিত যে স্পিলগুলি আপনার এসপিএর জন্য সেরা বিকল্প? রেলগুলি দুর্দান্ত, তবে এটি মনোোলিথ অ্যাপ্লিকেশনটিকে লক্ষ্য করে ... আপনি উদ্বেগ বিচ্ছেদ সহ একটি মডুলার ব্যাকএন্ড চাইবেন ... আপনার প্রয়োজনের উপর নির্ভর করে, আমি রিয়েল-টাইম এসপিএর জন্য বিকল্প রুবি ফ্রেমওয়ার্কগুলি বিবেচনা করব।
মাইস্ট

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

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

উত্তর:


10

সার্ভার থেকে ব্যবহারকারীর কাছে প্রেরিত ডেটা কীভাবে গঠন করবেন?

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

উদাহরণস্বরূপ, আপনি যদি স্টক টিকার আপডেট করে থাকেন এবং এএপিএল পরিবর্তিত হয়ে থাকেন তবে আপনি সমস্ত স্টকের দাম বা এএপিএল (নাম, বিবরণ ইত্যাদি) সম্পর্কিত সমস্ত ডেটা নীচে নামাতে চাইবেন না। আপনি কেবল এএপিএল, ব-দ্বীপ এবং নতুন দামকে চাপ দিন। ক্লায়েন্টে, তারপরে আপনি কেবলমাত্র সেই স্টকের দামটি ভিউতে আপডেট করবেন।

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

আমিও বলব না। আপনি যদি ইভেন্টটি প্রেরণ করছেন তবে এগিয়ে যান এবং এর সাথে প্রাসঙ্গিক ডেটা প্রেরণ করুন (পুরো বস্তুর ডেটা নয়) not এটি কী ধরণের ইভেন্টের জন্য একটি নাম দিন। (নামটির নামকরণ এবং কী কী ডেটা এই ইভেন্টের সাথে প্রাসঙ্গিক তা সিস্টেমের যান্ত্রিক কার্যকারিতা ছাড়িয়ে যায় This ব্যবসায়ের যুক্তি কীভাবে মডেল করা হয় তার সাথে এর আরও বেশি সম্পর্ক রয়েছে)) আপনার ভিউ আপডেটকারীদের প্রতিটি নির্দিষ্ট ইভেন্টকে কীভাবে অনুবাদ করতে হয় তা জানতে হবে একটি সুনির্দিষ্ট দর্শন পরিবর্তন (যেমন পরিবর্তিত হয়েছে কেবল তা আপডেট করুন)।

প্রেরিত ডেটাতে কীভাবে একটি সুসংগত এবং স্কেলেবল কঙ্কালের সংজ্ঞা দেওয়া যায়? এটি কি কোনও মডেল আপডেট বার্তা বা "ব্লেব্লাব্লাব্লাহ'র সাথে একটি ত্রুটি ছিল" বার্তাটি

আমি বলব এটি একটি বড়, মুক্ত-সমাপ্ত প্রশ্ন যা অন্য কয়েকটি প্রশ্নের মধ্যে বিভক্ত হয়ে আলাদাভাবে পোস্ট করা উচিত।

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

ব্যাকএন্ডের যে কোনও জায়গা থেকে কীভাবে সমস্ত কিছু তথ্য প্রেরণ করবেন না?

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

সার্ভারে এবং ক্লায়েন্টের উভয় ক্ষেত্রে ব্যবসায়ের যুক্তিযুক্ত সদৃশটি কীভাবে হ্রাস করা যায়?

দেখে মনে হচ্ছে আপনি ক্লায়েন্ট এবং সার্ভার উভয় ক্ষেত্রেই ভিউ ডেটা আপডেট করতে চলেছেন। আমার অনুমান যে আপনাকে সার্ভার-সাইড ভিউ ডেটা প্রয়োজন যাতে রিয়েল-টাইম ক্লায়েন্টটি শুরু করতে আপনার কাছে স্ন্যাপশট থাকে। দুটি ভাষা / প্ল্যাটফর্ম জড়িত থাকার কারণে (রুবি এবং জাভাস্ক্রিপ্ট), উভয়টিতে ভিউ আপডেটের যুক্তি লিখতে হবে। ট্রান্সপ্লাইং বাদে (যার নিজস্ব সমস্যা রয়েছে), আমি এর আশেপাশে কোনও উপায় দেখছি না।

প্রযুক্তিগত বিষয়: ডেটা ম্যানিপুলেশন (দেখুন আপডেট) ব্যবসায়ের যুক্তি নয়। আপনি যদি ব্যবহারের ক্ষেত্রে বৈধতা বোঝাতে চান, তবে এটি অপরিহার্য বলে মনে হয় কারণ ভাল ব্যবহারকারীর অভিজ্ঞতার জন্য ক্লায়েন্টের বৈধতা প্রয়োজনীয়, তবে শেষ পর্যন্ত সার্ভারের দ্বারা বিশ্বাস করা যায় না।


এখানে আমি কীভাবে এ জাতীয় জিনিসটি সুসংবদ্ধভাবে দেখছি।

ক্লায়েন্টের দর্শন:

  • একটি দর্শন স্ন্যাপশট এবং ভিউ এর শেষ দেখা ইভেন্ট নম্বর অনুরোধ
    • এটি ভিউটি প্রিপুলেট করবে যাতে ক্লায়েন্টকে স্ক্র্যাচ থেকে তৈরি করতে না হয়।
    • সরলতার জন্য HTTP GET এর ওপরে হতে পারে
  • একটি ওয়েবসকেট সংযোগ তৈরি করে এবং ভিউয়ের শেষ ইভেন্ট নম্বর থেকে শুরু করে নির্দিষ্ট ইভেন্টগুলিতে সদস্যতা গ্রহণ করে।
  • ওয়েবসকেটের মাধ্যমে ইভেন্টগুলি গ্রহণ করে এবং ইভেন্টের ধরণ / ডেটার উপর ভিত্তি করে এর দৃশ্য আপডেট করে।

ক্লায়েন্ট আদেশ:

  • ডেটা পরিবর্তনের জন্য অনুরোধ করুন (HTTP পুট / পোস্ট / মোছা)
    • প্রতিক্রিয়া হ'ল সাফল্য বা ব্যর্থতা + ত্রুটি
    • (পরিবর্তনের দ্বারা উত্পন্ন ইভেন্টগুলি গুলি ওয়েবসকেটের উপরে এসে একটি ভিউ আপডেট আপডেট করবে))

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

আমি যা বর্ণনা করেছি তা হ'ল একরকম সিকিউআরএস + মেসেজিং এবং আপনি যে ধরণের সমস্যার মুখোমুখি হচ্ছেন সেগুলি সমাধান করার জন্য একটি সাধারণ কৌশল।

আমি এই বিবরণে ইভেন্ট সোর্সিংকে আনিনি কারণ আমি নিশ্চিত নই যে এটি আপনি গ্রহণ করতে চান এমন কিছু কিনা বা আপনার প্রয়োজনে এটি প্রয়োজন হয় কিনা I'm তবে এটি একটি সম্পর্কিত প্যাটার্ন।


আমি বিষয়টিতে অনেক অগ্রগতি করেছি এবং আপনার দেওয়া পয়েন্টারগুলি খুব কার্যকর ছিল। আমি উত্তরটি গ্রহণ করেছিলাম কারণ আমি অনেকগুলি পরামর্শ ব্যবহার করেছি, এমনকি যদি আমি সেগুলির সমস্তগুলি ব্যবহার না করি। আমি অন্য উত্তরে আমি যে পথটি অনুসরণ করেছি তা বর্ণনা করতে যাচ্ছি।
ফিলিপ ডুরিক্স

4

মূলত ব্যাকএন্ডে কয়েক মাস কাজ করার পরে, প্ল্যাটফর্মের যে সমস্যার মুখোমুখি হয়েছিল তা মোকাবেলায় আমি এখানে কিছু পরামর্শ ব্যবহার করতে সক্ষম হয়েছি।

ব্যাকএন্ড পুনর্বিবেচনা করার সময় মূল উদ্দেশ্যটি ছিল CRUD- এর পক্ষে যথাসম্ভব শক্ত থাকা stick বহু রুটের চারদিকে ছড়িয়ে ছিটিয়ে থাকা সমস্ত ক্রিয়া, বার্তা এবং অনুরোধগুলি এমন সংস্থানগুলিতে পুনরায় গ্রুপিত হয়েছিল যা তৈরি, আপডেট, পড়া বা মুছে ফেলা হয়েছে । এটি এখন সুস্পষ্ট মনে হয়, তবে সাবধানতার সাথে প্রয়োগ করা চিন্তাভাবনার এটি একটি খুব কঠিন উপায়।

সমস্ত কিছু সংস্থানগুলিতে সংগঠিত হওয়ার পরে, আমি মডেলগুলিতে রিয়েলটাইম বার্তাগুলি সংযুক্ত করতে সক্ষম হয়েছি।

  • সৃষ্টি নতুন সংস্থান সহ একটি বার্তা ট্রিগার করে;
  • আপডেট কেবলমাত্র আপডেট হওয়া বৈশিষ্ট্য (প্লাস ইউআইডি) সহ একটি বার্তা ট্রিগার করে;
  • মুছে ফেলা একটি মোছার বার্তা ট্রিগার করে।

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

সামনের প্রান্তে, প্রতিটি সংস্থান একটি নির্দিষ্ট উপাদান দ্বারা পরিচালিত হয় যা তাদের সূচনাতে ট্রট HTTP লোড করে, তারপরে আপডেটের জন্য সাবস্ক্রাইব করে এবং সময়ের সাথে সাথে তাদের রাজ্য বজায় রাখে। এরপরে দৃশ্যগুলি রিসোর্সগুলি প্রদর্শন করতে এবং একই সংস্থাগুলির গর্তগুলিতে ক্রিয়া সম্পাদন করতে এইগুলি উপাদানগুলিতে আবদ্ধ হয়।


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

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

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