Идеи по улучшению 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, я подумаю над вашими предложениями, возможно, что-то из них найдет себе место в новой версии. |
|
Кстати, да, в новой версии планируется поддержка множества брокеров в рамках одного PropanApp. Возможно, хранение их в виде |
|
@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
# ...Таким образом вы можете легко управлять конфигурацией вашего проекта как при запусках, так и при тестировании. И, наверное, этот пример я добавлю в документацию. |
|
@b7w By the way, про проблемы, с которыми столкнулись, вы написали |
|
@b7w что думаете насчет подобного синтаксиса? |
Uh oh!
There was an error while loading. Please reload this page.
Когда на 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.All reactions