Идеи по улучшению API #124
Replies: 5 comments 12 replies
-
@b7w Добрый день! Спасибо за подробные комментарии. from propan.annotations import App, RabbitBroker
@app.after_startup
async def hook(app: App, broker: RabbitBroker):
... Как видите, никаких замыканий. По поводу описания конфигов и названий топиков в виде алиасов внутри приложения. Если честно, мне очень не нравится эта идея: зачем хранить инициализацию всех алиасов в коде, если использоваться в итоге будет только одна? Тем более такой подход существенно усложняет публичный API фреймворка app.broker('alise').publish('Hello!', 'test-queue') Выглядит не как то, что я хотел бы использовать каждый раз (тем более нужно помнить все строковые значения алиасов. Вместо предложенного вами подхода я прямо сейчас храню все названия топиков и данные для подключения в По поводу отложенной регистрации: она присутствует и сейчас. from propan import RabbitBroker
async def handler(msg): ...
broker = RabbitBroker()
broker.handle("test-queue")(handler) Может быть, это и не самый интуитивный интерфейс, но он работает.
Пожалуйста, комментируйте всегда и везде. Если вам неудобно пользоваться - возможно вы просто делаете что-то не тем способом, каким оно было задумано. Либо интерфейсы и правда неудобные и их стоит изменить. Никогда не поздно что-то менять.
Anyway, я подумаю над вашими предложениями, возможно, что-то из них найдет себе место в новой версии. |
Beta Was this translation helpful? Give feedback.
-
Кстати, да, в новой версии планируется поддержка множества брокеров в рамках одного PropanApp. Возможно, хранение их в виде |
Beta Was this translation helpful? Give feedback.
-
@b7w я просто не хочу вмешиваться в то, как пользователи управляют настройками проекта чтобы не ограничивать их в этом. Именно такого подхода и придерживаются все фреймворки (за исключением разве что Django). Однако, если у вас возникают какие-то проблемы с этим, вот пример того, как это делаю я в своих проектах: import os
from pydantic_settings import BaseSettings
from pydantic import Field
from propan import PropanApp
from propan.rabbit import RabbitBroker
class Settings(BaseSettings):
url: str = Field(...)
queue: str = "test-queue"
settings = Settings(_env_file=os.getenv("ENV", ".env"))
broker = RabbitBroker(settings.url)
app = PropanApp(broker)
@broker.handle(settings.queue)
async def handler(msg):
...
# ENV=.prod.env propan run serve:app
# ENV=.test.env pytest
# ... Таким образом вы можете легко управлять конфигурацией вашего проекта как при запусках, так и при тестировании. И, наверное, этот пример я добавлю в документацию. |
Beta Was this translation helpful? Give feedback.
-
@b7w By the way, про проблемы, с которыми столкнулись, вы написали |
Beta Was this translation helpful? Give feedback.
-
@b7w что думаете насчет подобного синтаксиса? |
Beta Was this translation helpful? Give feedback.
-
Когда на habr увидел первую версию propan, решил не комментировать. Ибо уже все написано. Но раз сейчас планируется мажорная смена версии, решил донести пару идей.
Декораторы это удобно когда все в одном файле и проект маленький. Но когда проект разрастается. хочется иметь обработчики отдельно от конфигурации, и не хочется тащить зависимость на app/broker в пакет с логикой.
Грубо говоря сейчас декоратор привязывает обработчик к конкретному брокеру и топику, что кажется не очень чистым кодом. И к примеру без переписывания кода нельзя поменять топик на тестовом стенде.
У нас в проектах в итоге все обрастает колхозными настройками
Предлагаю обратить внимание на описание подключений и настроек в виде конфига, а в коде ссылаться на alias.
Мне кажется хороший пример есть в helidon framework - https://helidon.io/docs/v3/#/mp/reactivemessaging/kafka
Так же важный большой плюс для кафки в таком подходе, ибо она имеет сотни тонких настроек - их где то надо будет указывать. Конфиг кажется для это правильным местом.
Возможно с этим подходом можно будет убрать зависимость на ссылку broker в after_startup:
В ваших примерах after_startup есть ссылка на
app
иbroker
- внешние зависимости. Лучше давать framework'ку управлять зависимостями, пуcть каждый обработчик получает первым аргументомapp
илиbroker
. А прикладной код не знает где и когда был создан объект app/broker.Beta Was this translation helpful? Give feedback.
All reactions