ورود

View Full Version : Message Queue



ali-baba
چهارشنبه 21 مرداد 1394, 12:57 عصر
سلام و خسته نباشید
اگه میشه یه توضیحی در مورد Message Queueها بهم بدید ممنون میشم.
می دونم تویه اینترنت هست، ولی می خواستم به صورت اجمالی بهم توضیح بدید و البته تا نسبتی هم کامل باشه که بفهمم کلیاتش چی میگه.
باتشکر

ahmad.mo74
چهارشنبه 21 مرداد 1394, 22:12 عصر
استفاده از message queue این قابلیتو بهمون میده که بتونیم از معماری های Event-driven (https://en.wikipedia.org/wiki/Event-driven_programming) برای پردازش درخواست ها استفاده کنیم و اگر معماری خوبی براش بنویسیم میشه با تعداد ترد کم، تعداد درخواست بالایی رو جواب داد.

ابتدایی ترین حالتش اینه که از یک صف و یک ترد استفاده کنیم. یعنی هر درخواستی (مسیج) میاد وارد صف میشه و یک ترد به صورت مداوم در حال بیرون کشیدن مسیجا و پروسس کردنشونه. (Inbound Message Queue)
برای ارسال جواب هم میشه دقیقا یک صف و یک ترد در نظر گرفت. (Outbound Message Queue)
یا اینکه بعد از انجام پروسس ارسال بشه. (که میتونه پهنای باند زیادی رو اشغال کنه)

معماری های دیگه ای که میشه زد :

1- بازم یک صف داشته باشیم با این تفاوت که اینبار بیش از یک ترد روی صف پروسس انجام بدن. اینجا باید حواسمون باشه تا از صف های thread-safe مثل LinkedBlockingQueue (http://tutorials.jenkov.com/java-util-concurrent/linkedblockingqueue.html) و LinkedBlockingDeque (http://tutorials.jenkov.com/java-util-concurrent/linkedblockingdeque.html) استفاده کنیم.

2- به ازای هر کانکشن (یا هر کاربر) یک صف داشته باشیم و به ازای هر صف یک ترد. برای تعداد کمی کاربر ممکنه بهترین جوابو بهمون بده، اما هر چه تعداد بره بالاتر ... :اشتباه:
مزیت این روش نسبت به قبلی اینه که نیازی به استفاده از صف های thread-safe نیست و میتونیم مطمئن باشیم که درخواست های یک کاربر به صورت سریالی پروسس میشه و هیچ concurrency ای توش به وجود نمیاد.

3 - بازم به ازای هر کانکشن (یا هر کاربر) یک صف داشته باشیم ولی تعداد ترد ها ثابت باشه و از یه حدی بیشتر نشه.
این روش ایده آل ترین روشه، اما پیاده سازیش نیاز به زمان داره و باید حسابی رو منطقش فکر کنید. (حتما باید از thread pool استفاده بشه)
اینکه دائما باید صف ها بین تردها جا به جا بشن و صف هایی که خالی میشن بعد از مدت زمان کوتاهی از چرخه خارج بشن و تردی رو متوقف نکنن (دوباره به محض اومدن مسیج باید وارد چرخه بشن).
تو این روش هم مثل قبلی نیازی به استفاده از صف های thread-safe نیست.

تو تمام حالتا بهتره که از thread pool استفاه بشه. ExecutorService (http://tutorials.jenkov.com/java-util-concurrent/executorservice.html) و ForkJoinPool (http://tutorials.jenkov.com/java-util-concurrent/java-fork-and-join-forkjoinpool.html) بهترین گزینه ها هستن.