Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠΉΠ½ΠΎ-ориСнтированная Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° Π½Π° Python 3 с использованиСм AnyIO ΠΈ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π° Message Bus

Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠΉΠ½ΠΎ-ориСнтированная Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° (Event-Driven Architecture, EDA) становится всС Π±ΠΎΠ»Π΅Π΅ популярной Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ соврСмСнных ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ благодаря своСй гибкости ΠΈ способности ΠΊ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ. Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ рассмотрим основы событийно-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹, познакомимся с ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ΠΎΠΌ Message Bus (шина сообщСний) ΠΈ ΠΈΠ·ΡƒΡ‡ΠΈΠΌ, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ AnyIO для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ событийной систСмы Π½Π° Python 3.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ событийно-ориСнтированная Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°?

Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠΉΠ½ΠΎ-ориСнтированная Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° β€” это ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΠ° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ основным ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠΌ взаимодСйствия ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ систСмы ΡΠ²Π»ΡΡŽΡ‚ΡΡ события. Бобытия ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой увСдомлСния ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ΅Π΄ΡˆΠΈΡ… измСнСниях ΠΈΠ»ΠΈ дСйствиях Π² систСмС. ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ систСмы Ρ€Π΅Π°Π³ΠΈΡ€ΡƒΡŽΡ‚ Π½Π° события, Ρ‡Ρ‚ΠΎ позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ слабо связныС ΠΈ Π»Π΅Π³ΠΊΠΎ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌΡ‹Π΅ прилоТСния.

ΠŸΠ°Ρ‚Ρ‚Π΅Ρ€Π½ Message Bus (Π¨ΠΈΠ½Π° сообщСний)

ΠŸΠ°Ρ‚Ρ‚Π΅Ρ€Π½ Message Bus β€” это структурный шаблон проСктирования, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ обСспСчиваСт ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ систСмы посрСдством ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ сообщСний. Π¨ΠΈΠ½Π° сообщСний дСйствуСт ΠΊΠ°ΠΊ посрСдник ΠΌΠ΅ΠΆΠ΄Ρƒ отправитСлями (производитСлями) ΠΈ получатСлями (потрСбитСлями) сообщСний.

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π°:

  • Блабая ΡΠ²ΡΠ·Π°Π½Π½ΠΎΡΡ‚ΡŒ: ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ систСмы Π½Π΅ зависят Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π°.
  • Π Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌΠΎΡΡ‚ΡŒ: Π›Π΅Π³ΠΊΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΈΠ»ΠΈ Ρ‚ΠΈΠΏΡ‹ сообщСний.
  • ΠœΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ: БистСма ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ большоС количСство сообщСний эффСктивно.
  • Π£ΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡŽ: Π Π°Π·Π½ΠΎΡ€ΠΎΠ΄Π½Ρ‹Π΅ систСмы ΠΌΠΎΠ³ΡƒΡ‚ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· ΠΎΠ±Ρ‰ΡƒΡŽ ΡˆΠΈΠ½Ρƒ.

AnyIO: Π£Π½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Π°Ρ асинхронная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°

AnyIO β€” это ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° для написания асинхронного ΠΊΠΎΠ΄Π° Π² Python, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ Π΅Π΄ΠΈΠ½Ρ‹ΠΉ API ΠΏΠΎΠ²Π΅Ρ€Ρ… Ρ€Π°Π·Π½Ρ‹Ρ… асинхронных Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠ², Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ asyncio, trio ΠΈ curio. Π­Ρ‚ΠΎ позволяСт ΠΏΠΈΡΠ°Ρ‚ΡŒ пСрСносимый асинхронный ΠΊΠΎΠ΄, Π½Π΅ зависящий ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ возмоТности AnyIO:

  • АсинхронныС ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹ синхронизации.
  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚ΠΎΠ² ΠΈ ΠΎΡ‚ΠΌΠ΅Π½Ρ‹ Π·Π°Π΄Π°Ρ‡.
  • АсинхронныС сСтСвыС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ.
  • Π‘ΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°ΠΌΠΈ.

РСализация событийно-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ систСмы с использованиСм AnyIO ΠΈ Message Bus

Рассмотрим, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ событийно-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ систСму Π½Π° Python 3, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ AnyIO ΠΈ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ Message Bus.

Π¨Π°Π³ 1: Установка AnyIO

УстановитС AnyIO Ρ‡Π΅Ρ€Π΅Π· pip:

pip install anyio

Π¨Π°Π³ 2: ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ событий

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс для событий с использованиСм dataclass:

# events.py

from dataclasses import dataclass

@dataclass
class Event:
    name: str
    payload: dict

Π¨Π°Π³ 3: РСализация Message Bus

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ класс MessageBus, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ подпиской Π½Π° события ΠΈ ΠΈΡ… ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ:

# message_bus.py

import anyio
from typing import Callable, Dict, List

class MessageBus:
    def __init__(self):
        self.subscribers: Dict[str, List[Callable]] = {}

    def subscribe(self, event_name: str, handler: Callable):
        if event_name not in self.subscribers:
            self.subscribers[event_name] = []
        self.subscribers[event_name].append(handler)

    async def publish(self, event):
        handlers = self.subscribers.get(event.name, [])
        async with anyio.create_task_group() as task_group:
            for handler in handlers:
                task_group.start_soon(handler, event)

Π—Π΄Π΅ΡΡŒ MessageBus Ρ…Ρ€Π°Π½ΠΈΡ‚ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ подписчиков ΠΈ асинхронно Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΏΡ€ΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ событий.

Π¨Π°Π³ 4: Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² событий

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ события:

# handlers.py

async def handle_user_registered(event):
    print(f"[Email Service] ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° привСтствСнного письма Π½Π° {event.payload['email']}")

async def handle_user_registered_log(event):
    print(f"[Log Service] ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ зарСгистрирован: {event.payload['email']}")

Π¨Π°Π³ 5: РСализация бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π±ΡƒΠ΄Π΅Ρ‚ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ события ΠΏΡ€ΠΈ рСгистрации ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ:

# services.py

from events import Event

async def register_user(bus, name, email):
    # Π˜ΠΌΠΈΡ‚ΠΈΡ€ΡƒΠ΅ΠΌ сохранСниС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π² Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…
    print(f"[User Service] РСгистрируСм ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ {name} с email {email}")
    # ΠŸΡƒΠ±Π»ΠΈΠΊΡƒΠ΅ΠΌ событиС ΠΎ рСгистрации ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
    event = Event(name="user_registered", payload={"name": name, "email": email})
    await bus.publish(event)

Π¨Π°Π³ 6: ОбъСдинСниС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΈ запуск прилоТСния

# main.py

import anyio
from message_bus import MessageBus
from handlers import handle_user_registered, handle_user_registered_log
from services import register_user

async def main():
    bus = MessageBus()
    # ΠŸΠΎΠ΄ΠΏΠΈΡΡ‹Π²Π°Π΅ΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π½Π° событиС 'user_registered'
    bus.subscribe("user_registered", handle_user_registered)
    bus.subscribe("user_registered", handle_user_registered_log)
    # РСгистрируСм Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ
    await register_user(bus, "Иван", "ivan@example.com")
    await register_user(bus, "ΠœΠ°Ρ€ΠΈΡ", "maria@example.com")

if __name__ == "__main__":
    anyio.run(main)

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния

[User Service] РСгистрируСм ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Иван с email ivan@example.com
[Email Service] ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° привСтствСнного письма Π½Π° ivan@example.com
[Log Service] ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ зарСгистрирован: ivan@example.com
[User Service] РСгистрируСм ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠœΠ°Ρ€ΠΈΡ с email maria@example.com
[Email Service] ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° привСтствСнного письма Π½Π° maria@example.com
[Log Service] ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ зарСгистрирован: maria@example.com

ОбъяснСниС Ρ€Π°Π±ΠΎΡ‚Ρ‹ систСмы

  1. Message Bus: Π¦Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠΉ Π·Π° ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΡŽ событий ΠΌΠ΅ΠΆΠ΄Ρƒ отправитСлями ΠΈ получатСлями.
  2. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ событий: Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ подписаны Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ события ΠΈ Ρ€Π΅Π°Π³ΠΈΡ€ΡƒΡŽΡ‚ Π½Π° Π½ΠΈΡ….
  3. БизнСс-Π»ΠΎΠ³ΠΈΠΊΠ°: ΠŸΡ€ΠΈ рСгистрации ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ гСнСрируСтся событиС user_registered, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ публикуСтся Π½Π° ΡˆΠΈΠ½Ρƒ сообщСний.
  4. ΠΡΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½ΠΎΡΡ‚ΡŒ: Благодаря AnyIO ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ событий Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ асинхронно, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ систСмы.

Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ

Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²Ρ‹Ρ… событий ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ²

МоТно Π»Π΅Π³ΠΊΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ события ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ:

# Новый ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΊΡƒΠΏΠΎΠ½Π° Π½ΠΎΠ²ΠΎΠΌΡƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ

async def handle_send_coupon(event):
    print(f"[Coupon Service] ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° ΠΊΡƒΠΏΠΎΠ½Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ {event.payload['email']}")

ПодпишСм Π΅Π³ΠΎ Π½Π° событиС user_registered:

bus.subscribe("user_registered", handle_send_coupon)

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок

ΠŸΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Π²Π°ΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ошибок:

async def publish(self, event):
    handlers = self.subscribers.get(event.name, [])
    async with anyio.create_task_group() as task_group:
        for handler in handlers:
            task_group.start_soon(self._safe_invoke_handler, handler, event)

async def _safe_invoke_handler(self, handler, event):
    try:
        await handler(event)
    except Exception as e:
        print(f"[Error] ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ {handler.__name__} Π²Ρ‹Π·Π²Π°Π» ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅: {e}")

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ с внСшними систСмами

Π¨ΠΈΠ½Ρƒ сообщСний ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с внСшними Π±Ρ€ΠΎΠΊΠ΅Ρ€Π°ΠΌΠΈ сообщСний, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ RabbitMQ ΠΈΠ»ΠΈ Kafka, для обСспСчСния ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΠΈ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ микросСрвисов.

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° использования AnyIO ΠΈ Message Bus

  • Π£Π½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ: AnyIO позволяСт ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄, нСзависимый ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ асинхронного Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°.
  • ΠœΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ: Асинхронная ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° событий ΠΏΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ систСмы ΠΏΡ€ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠΈ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ.
  • ΠŸΡ€ΠΎΡΡ‚ΠΎΡ‚Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ: ΠŸΠ°Ρ‚Ρ‚Π΅Ρ€Π½ Message Bus ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ ΠΊΠΎΠ΄Π΅.
  • Блабая ΡΠ²ΡΠ·Π°Π½Π½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²: Π£Π»ΡƒΡ‡ΡˆΠ°Π΅Ρ‚ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° ΠΈ ΠΎΠ±Π»Π΅Π³Ρ‡Π°Π΅Ρ‚ тСстированиС.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠΉΠ½ΠΎ-ориСнтированная Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° с использованиСм ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π° Message Bus ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ AnyIO прСдоставляСт ΠΌΠΎΡ‰Π½Ρ‹ΠΉ инструмСнт для создания Π³ΠΈΠ±ΠΊΠΈΡ… ΠΈ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° Python 3. Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ способствуСт ΠΏΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΡŽ систСм, способных эффСктивно ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ большоС количСство событий ΠΈ Π»Π΅Π³ΠΊΠΎ Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ΡŒΡΡ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ нСобходимости.

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ рСсурсы