rabbitmq چهار نوع exchange داره که با کمک Routing Key ها و Header Attribute ها نوع مورد نظر رو ایجاد کنیم.
در rabbitmq پیام ها مستقیم به سمت Queue (صف) ها نمیره! پیام در ابتدا به exchange میره که کارش مدیریت جایگیری پیام در صف مورد نظره اینصورت که با استفاده از Routing key و Header Attribute که از طرف Producer (ارجاع دهنده یا همون ارسال کننده) دریافت می کنه تصمیم میگیره که پیام در چه صفی قرار بگیره.
نکته جالب مسئله اینجاست که فقط با الگوی string که در Routing Key مینویسیم سه نوع از چهار نوع exchange ایجاد میشه و مورد چهارم هم با کمک Header Attribute که به شکل کلید مقدار پر میشه ایجاد میشه.
Routing key و Header Attribute در واقع یک آدرس هست که در زمان bind (ارجاع دادن) درخواست به صف، به binder (ارجاع دهنده) میگه که درخواست در کدوم صف یا صف ها قرار بگیره.
برای ساخت این نوع کافیه زمان ایجاد Exchange یک رشته بدون استفاده از کارکتر ( . ) نقطه یا ستاره (*) به Routing Key اختصاص بدید ( این رشته میتونه هرچیزی باشه نام یک رنگ ، نام حیوان خونگیتون یا هرچیز دیگه ای) .
channel.basic_publish(routing_key='blue')
در این نوع Exchange درخواست رو در صف مورد نظر قرار میده.
برای ساخت این نوع کافیه زمان ایجاد Routing Key رو خالی رها کنید.
channel.basic_publish(routing_key='')
در این نوع Exchange درخواست رو در تمامی صف ها قرار میده.
برای ساخت این نوع Routing Key رو با الگویی از رشته پر میکنیم (برای اینکه الگوی مورد نظر رو پیاده سازی کنیم باید از دو کارکتر نقطه ( . ) و ستاره ( * ) استفاده کنیم.
چند مثال از این الگو ها عبارتند از
channel.basic_publish(routing_key='pink.red.green')
در این نوع Exchange درخواست رو بر اساس الگو در صف ها قرار میده.
برای ساخت این نوع باید با Attribute properties و به شکل زیر هدر مورد نظرمون رو ایجاد کنیم.
properties=pika.BasicProperties( headers={'key': 'value'} # Add a key/value header )
چند مثال از این headers ها عبارتند از
headers={"x-match": "any", "type": "char", "model": "sdk"}
headers={"x-match": "all", "type": "original", "color": "red"}
در headers یک هدر ویژه با کلید x-match وجو داره که دو مقدار any یا all رو میگیره ( مقدار پیش فرض all) هست این هدر ویژه تعیین میکنه که بر چه اسای سایر هدر ها باید منطق بشن . وقتی مقدار all باشه یعنی همه کلید مقدار های باید منطبق باشن ولی اگر any باشه یعنی کافیه یکی از هدر ها منطبق باشه تا درخواست به اون صف bind (ارجاع) داده بشه.
در این نوع Exchange درخواست رو بر اساس x-match و الگویی که بصورت Key و Value در headers نوشتید در صف قرار میده.