تو چند دقیقه نحوه کار با Redis Pub/Sub رو تو پایتون یاد بگیر
Pub/Sub
(انتشار/اشتراک) یک الگوی معماری است که به برنامهها اجازه میدهد تا به صورت غیرمستقیم با یکدیگر ارتباط برقرار کنند. در این الگو، تولیدکنندگان اطلاعات (Publisher) پیامها را منتشر میکنند و مصرفکنندگان (Subscriber) به موضوعات (Topics) خاصی که به آنها علاقهمند هستند، اشتراک میگذارند. این سیستم اجازه میدهد تا بدون نیاز به وابستگی مستقیم با یکدیگر، اطلاعات را تبادل کنند.
مزایای Pub/Sub
- کاهش وابستگیها: تولیدکنندگان و مصرفکنندگان نیازی به شناخت یکدیگر ندارند.
- مقیاسپذیری: میتوان به سادگی مصرفکنندگان و تولیدکنندگان جدیدی اضافه کرد.
- توزیعپذیری: میتوان سیستمها را به صورت توزیعشده پیادهسازی کرد.
مثال ساده با Redis Pub/Sub
در این مثال، از Redis به عنوان سیستم Pub/Sub استفاده خواهیم کرد. ابتدا باید Redis را نصب و راهاندازی کنید.
نصب Redis
تو ریپازیتوری ای که لینکشو آخر پست میذارم، سرویس ردیس رو توی docker-compose.yml مشخص کردم و روی داکر اجراش میکنیم.
همچنین داخل فایل .env تنظیمات ردیس رو میتونید مشخص کنید.
پیادهسازی در پایتون
برای این کار به کتابخانه
در این مثال، یک Publisher و یک Subscriber خواهیم داشت.
Publisher (server.py):
در قدم اول کانکشن با ردیس رو می سازیم.
با متد ping میتونیم چک کنیم وضعیت کانگشنمون اوکی هست یا نه(جنبه آموزشی نوشتمش)
بعد مشخص کردیم که topic ما اسمش چیه.
دیتایی که قراره داخل payload مسیج قرار بدیم رو مشخص کردیم که بصورت دیکشنری هستش و بعدش اومدیم به json تبدیلش کردیم و مسیح رو پابلیش کردیم.
Subscriber (client.py):
در قدم اول یک کانکشن ردیس گرفتیم. بعد تاپیکی که subscribe میکنیمش رو مشخص کردیم(میتونیم چندین تا تاپیک رو سابسکرایب کنیم)
در قدم بعدی داخل یک long running میایم به مسیج های جدیدی که میاد گوش میدیم و یک switch case زدیم و براساس تاپیک ها میتونیم کارهای خاص خودش رو انجام بدیم.
نحوه اجرا
1. در یک ترمینال،
2. در یک ترمینال دیگه server.py رو اجرا کنید که با هربار اجرا یک مسیج رو پابلیش میکنه.
سورس کد:
https://github.com/alireza-fa/redis-pub-sub-example
#redis_pub_sub #pub_sub #event_driven #python
@Syntax_fa
Pub/Sub
(انتشار/اشتراک) یک الگوی معماری است که به برنامهها اجازه میدهد تا به صورت غیرمستقیم با یکدیگر ارتباط برقرار کنند. در این الگو، تولیدکنندگان اطلاعات (Publisher) پیامها را منتشر میکنند و مصرفکنندگان (Subscriber) به موضوعات (Topics) خاصی که به آنها علاقهمند هستند، اشتراک میگذارند. این سیستم اجازه میدهد تا بدون نیاز به وابستگی مستقیم با یکدیگر، اطلاعات را تبادل کنند.
مزایای Pub/Sub
- کاهش وابستگیها: تولیدکنندگان و مصرفکنندگان نیازی به شناخت یکدیگر ندارند.
- مقیاسپذیری: میتوان به سادگی مصرفکنندگان و تولیدکنندگان جدیدی اضافه کرد.
- توزیعپذیری: میتوان سیستمها را به صورت توزیعشده پیادهسازی کرد.
مثال ساده با Redis Pub/Sub
در این مثال، از Redis به عنوان سیستم Pub/Sub استفاده خواهیم کرد. ابتدا باید Redis را نصب و راهاندازی کنید.
نصب Redis
تو ریپازیتوری ای که لینکشو آخر پست میذارم، سرویس ردیس رو توی docker-compose.yml مشخص کردم و روی داکر اجراش میکنیم.
همچنین داخل فایل .env تنظیمات ردیس رو میتونید مشخص کنید.
docker-compose up -d
پیادهسازی در پایتون
برای این کار به کتابخانه
redis
نیاز داریم. میتوانید آن را با pip نصب کنید:pip install redis
در این مثال، یک Publisher و یک Subscriber خواهیم داشت.
Publisher (server.py):
import json
from redis import StrictRedis
server = StrictRedis(host="localhost", port=6399, password="redis_password", db=0)
# redis ping
print(server.ping())
topic = "example_topic"
data = {
"name": "alireza",
"age": 22,
}
server.publish(channel=topic, message=json.dumps(data))
در قدم اول کانکشن با ردیس رو می سازیم.
با متد ping میتونیم چک کنیم وضعیت کانگشنمون اوکی هست یا نه(جنبه آموزشی نوشتمش)
بعد مشخص کردیم که topic ما اسمش چیه.
دیتایی که قراره داخل payload مسیج قرار بدیم رو مشخص کردیم که بصورت دیکشنری هستش و بعدش اومدیم به json تبدیلش کردیم و مسیح رو پابلیش کردیم.
Subscriber (client.py):
import json
from redis import StrictRedis
client = StrictRedis(host="localhost", port=6399, password="redis_password", db=0)
topic = "example_topic"
pubsub = client.pubsub()
pubsub.subscribe(topic)
print("waiting for message...")
while True:
for message in pubsub.listen():
if message["data"] == 1:
continue
match message["type"]:
case topic:
# TODO - change serialization. json is not good
data = json.loads(message["data"])
print("received message", data["name"], data["age"])
در قدم اول یک کانکشن ردیس گرفتیم. بعد تاپیکی که subscribe میکنیمش رو مشخص کردیم(میتونیم چندین تا تاپیک رو سابسکرایب کنیم)
در قدم بعدی داخل یک long running میایم به مسیج های جدیدی که میاد گوش میدیم و یک switch case زدیم و براساس تاپیک ها میتونیم کارهای خاص خودش رو انجام بدیم.
نحوه اجرا
1. در یک ترمینال،
client.py
را اجرا کنید2. در یک ترمینال دیگه server.py رو اجرا کنید که با هربار اجرا یک مسیج رو پابلیش میکنه.
سورس کد:
https://github.com/alireza-fa/redis-pub-sub-example
#redis_pub_sub #pub_sub #event_driven #python
@Syntax_fa
🔥6💋4👍3❤1👎1🙏1