ওয়েবস্পিয়ার এমকিউ বা টিবকো রেন্ডজেভাসের মতো মেসেজিং সমাধানগুলির পরিবর্তে অভিনেতাদের ব্যবহার কখন করবেন?


106

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

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

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

পূর্বের উল্লিখিত পণ্যগুলি - ওয়েবস্পিয়ার এমকিউ বা অ্যাক্টিভএমকিউ - এখনও পর্যন্ত সফলভাবে ব্যবহৃত হয়েছে এমন কিছু ব্যবহারের ক্ষেত্রে আমি কখন এবং কেন আক্কাকে ব্যবহার করব? আমার ভবিষ্যতের প্রকল্পে আমি কেন ওয়েবস্পিয়ার এমকিউ বা টিবকো আরভি এর পরিবর্তে আক্কা ব্যবহার করার কথা বিবেচনা করব?

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

জেএমএম পরিবেশে আমার আর একটি বার্তা সমাধান হতে পারে যা জেএমএস (পয়েন্ট-টু-পয়েন্ট), টিবকআরভি (মাল্টিকাস্ট) এবং আক্কা ছাড়াও আমার বিবেচনা করা উচিত?


2
stackoverflow.com/questions/4648280/scala-actors-vs-jms/… দরকারী হতে পারে।
srnm

উত্তর:


92

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

দুটি মডেল অবশ্য অনুশীলনে খুব একইরকম হয়ে যায় কারণ তারা উভয়ই ইভেন্টের বার্তা ভিত্তিক: রব্বিটএমকিউ বনাম আক্কা সম্পর্কে আমার উত্তর দেখুন ।

আপনি যদি কেবল জেভিএম এর জন্য কোড করতে যাচ্ছেন তবে আক্কা সম্ভবত একটি ভাল পছন্দ। অন্যথায় আমি খরগোশ এমকিউ ব্যবহার করতাম।

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

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

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

এটি বলা হচ্ছে যে আক্কার রিমোটিংটি বরং নতুন এবং সম্ভবত এখনও theতিহ্যবাহী বার্তাগুলির সারি সরবরাহকারী সমস্ত নির্ভরযোগ্য বার্তা গ্যারান্টি এবং কিউএস সরবরাহ করে না (তবে এটি প্রতিদিন পরিবর্তিত হচ্ছে)। এটি সাধারণত পিয়ার-টু-পিয়ারও মনে করে তবে আমি কি মনে করি যে সার্ভার-টু-পিয়ারকে সমর্থন করে যা বেশিরভাগ এমকিউ সিস্টেমগুলিই করে (অর্থাত ব্যর্থতার একক পয়েন্ট) তবে এমকিউ সিস্টেম রয়েছে যা পিয়ার-টু-পিয়ার (রব্বিটএমকিউ সার্ভার- টু পিয়ার)।

অবশেষে রাব্বিটএমকিউ এবং আক্কা আসলে একটি ভাল জুটি তৈরি করে। আপনি আব্বাকে এমবিতে মোড়ক হিসাবে ব্যবহার করতে পারেন বিশেষত যেহেতু রব্বিটএমকিউ আপনাকে বার্তাগুলির ব্যবহার পরিচালনা করতে এবং বার্তাগুলি স্থানীয়ভাবে (একক জেভিএম) রাউটিংয়ে সহায়তা করে না।

আক্কা কখন নির্বাচন করবেন

  • প্রচুর ভোক্তা রয়েছে (লক্ষ লক্ষ)।
  • কম বিলম্বের প্রয়োজন
  • অভিনেতা সম্মতি মডেল খুলুন

উদাহরণ সিস্টেম: একটি ইন্টারেক্টিভ রিয়েল টাইম চ্যাট সিস্টেম

কখন এমকিউ নির্বাচন করবেন

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

উদাহরণ সিস্টেম: একটি নির্ধারিত ট্রানজেকশনাল ব্যাচ প্রসেসিং সিস্টেম

সম্পর্কিত মন্তব্যগুলির উপর ভিত্তি করে EDIT

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

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

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


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

2
আচ্ছা হ্যাঁ এবং না। আক্কা বিতরণকৃত বার্তাপ্রেরণ সমর্থন করে এবং আপনি খুব সহজেই বার্তা কাতারের দৃষ্টান্ত (গুগল স্প্রিংয়ের চুল্লী) বন্ধ সমঝোতা মডেল তৈরি করতে পারেন। সত্যই এখন পার্থক্যটি হ'ল রাবিট এমকিউতে টেকসই বার্তা রয়েছে .. ওহ অপেক্ষা করুন আক্কা এখন এটি সমর্থন করে। তিনি শিরোনামে "অভিনেতা" বলতে পারেন তবে স্পষ্টভাবে আক্কাকে নির্দেশ করেছেন যা অনেক বার্তা ভিত্তিক সিস্টেমের (প্রচলিত এবং বিতরণ উভয়) দিয়ে ব্যাপক ওভারল্যাপ করে।
অ্যাডাম জেন্ট

4
বিটিডাব্লু @ আইগরস। বার্তাগুলির সারিগুলির সাথে ব্যবহৃত সাধারণভাবে একত্রে যুক্ত মডেলকে SEDA (স্টেজড ইভেন্ট চালিত আর্কিটেকচার) বলা হয়। ক্যুইস, টপিক এবং এক্সচেঞ্জগুলি ব্যবহার করার পাশাপাশি এটি নিজের মধ্যে একটি কনক্রান্সসি মডেল (এটি কেবল অভিনেতার মডেলের মতোই বিতরণ করা মডেল হিসাবে ঘটে)। কেউ "ভুল প্রশ্ন" বললে আমি সত্যিই তুচ্ছ হয়ে উঠি .. অনুপযুক্ত প্রশ্নের পাশাপাশি যখন কোন প্রশ্নও ভুল হতে পারে? এরকম কিছু বলতে এর ছদ্মবেশী এবং অভিজাত শ্রেণি।
অ্যাডাম জেন্ট

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

1
একটি আক্কা জাভা এপিআই - এটি এখন খুব পরিষ্কার, বিশেষত জেডিকে 8 ল্যাম্বডাসের সাথে। আমি সন্দেহ করি যে তারা / জেডিকে ১০ দিয়ে মূল্য বস্তুগুলি প্রবর্তন করলে আরও ভাল হবে
রব ক্র্যাফোর্ড

4

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

https://github.com/zcox/akka-zeromq-java


6
জিরোমিকিউ হুবহু মেসেজিং সিস্টেম নয়। এটি বরং এক ধরণের উন্নত সকেট। জিরোমিকিউর চেয়ে সম্পূর্ণ-পরিপূর্ণ মেসেজিং সিস্টেমগুলি আরও জটিল। আপনার লিঙ্কের প্রকল্পটি আক্কার জিরোমিকিউয়ের চারপাশে কেবল একটি পাতলা মোড়ক হিসাবে মনে হচ্ছে।
ভ্লাদিমির মাত্তেভ

1

আকো-উট জিরোএমকিউর চেয়ে আরও ভাল উদাহরণ হবে - জিরোএমকিউ টিসিপি যোগাযোগের জন্য সরাসরি টিসিপি (অতএব শূন্য - কোনও বার্তার সারি নেই)।

আক্কা ক্যামেলের সাহায্যে আপনি সারিটি বিমূর্ত করে ফেলতে পারেন এবং কোনও কোড ছাড়াই কোনও অভিনেতার কাছ থেকে সরাসরি বার্তা সরবরাহ করতে / টানতে বার্তা সরবরাহ করতে / বার করতে পারবেন।

আপনি আক্কা-জেরোমক ফোরগো করতে পারেন এবং রিমোটিংয়ের সাথে সরাসরি আক্কা ব্যবহার করতে পারেন। আমি মনে করি মূল লাইব্রেরি থেকে আক্কা-জেরোমক সরিয়ে ফেলা হচ্ছে তবে আমরা আক্কার জন্য স্কেলা-জেরোমক ( https://github.com/mDialog/scala-zeromq ) নামে একটি ভাল জেরমক লাইব্রেরি তৈরি করেছি we

আক্কায় কয়েকটি মূল মূল ব্যবহারের মামলা রয়েছে:

1) পরিবর্তনযোগ্য অবস্থা

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

2) বিতরণ

আক্কায় কনক্যুরঞ্জি নিখরচায় তাই আপনি বলছেন এটি সত্যিই বিতরণের সমস্যাগুলি সমাধান করার বিষয়ে। মেশিন এবং কোর জুড়ে বিতরণ। আক্কা তারের মাধ্যমে বার্তা প্রেরণের জন্য "লোকেশন স্বচ্ছতা" তৈরি করেছে। এটিতে ক্লাস্টারিং এবং প্যাটারগুলি যুক্ত রয়েছে যা কোনও একক পরিষেবাদিও স্কেলিংয়ের জন্য। এটি এটিকে বিতরণের জন্য খুব ভাল সমাধান করে তোলে (উদাঃ মাইক্রো-পরিষেবা আর্কিটেকচার)

আক্কা-উটের সাথে অ্যাক্টিভিউকিউ সহ আক্কা ব্যবহারের উদাহরণ এখানে রয়েছে (জাভা 8 ব্যবহার করে)

import akka.actor.Props;
import akka.camel.Camel;
import akka.camel.CamelExtension;
import akka.testkit.TestActorRef;
import akka.testkit.TestProbe;
import org.junit.Ignore;
import org.junit.Test;
import akka.camel.javaapi.UntypedProducerActor;
import akka.camel.javaapi.UntypedConsumerActor;
import static com.rogers.totes.TotesTestFixtures.*;
import org.apache.activemq.camel.component.*;

public class MessagingTest {
    @Test @Ignore
    public void itShouldStoreAMessage() throws Exception{
        String amqUrl = "nio://localhost:61616";
        Camel camel = (Camel) CamelExtension.apply(system);
        camel.context().addComponent("activemq", ActiveMQComponent.activeMQComponent(amqUrl));

        TestProbe probe = TestProbe.apply(system);
        TestActorRef producer = TestActorRef.create(system, Props.create((Producer.class)));
        TestActorRef consumer = TestActorRef.create(system, Props.create((Consumer.class)));
        producer.tell("Produce", probe.ref());

        Thread.sleep(1000);
    }
}

class Producer extends UntypedProducerActor{

    @Override
    public String getEndpointUri() {
        return "activemq:foo.bar";
    }
}

class Consumer extends UntypedConsumerActor{

    @Override
    public String getEndpointUri() {
        return "activemq:foo.bar";
    }

    @Override
    public void onReceive(Object message) throws Exception {
        System.out.println("GOT A MESSAGE!" + message);

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