Я строю небольшие сервисы в Хаскелле. Я хотел бы сделать границу между услугами формальной, так что процесс сборки скажет разработчику, если контракт был нарушенИнтерфейсы для границ микросервисов - как импортировать код?
Для простого примера, скажем, у нас есть API с маршрутом POST/users. Он должен добавить пользователя в очередь пользователей. Затем у нас есть один рабочий, который читает из очереди и обрабатывает нового пользователя.
контракт между двумя выглядит как:
- обмен называется «обмен»
- Очередь называется «пользователей»
- Сообщения должны быть пользователем объектов сериализуется в JSON (или msgpack, или Protobuf)
- пользователей:
{ name : String, age : Int }
Как я могу применять это так, что я получаю ошибки построения если любой из этих служб:
- Подключения к неправильной очереди или обмену
- использует неверную схему для пользователя
Это было бы легко, если весь код был в одном хранилище, но один из главных цели микросервисов, как я их понимаю, - сделать их независимыми. Как это можно сделать с отдельными репозиториями?
У меня возникла идея создать третье репо для контракта, и от него зависят оба сервиса. Если бы он содержал некоторые типы Haskell, API и рабочий могли бы включить его и typecheck их реализации против него. Если я это сделаю, как мне обращаться с версией? Должны ли они включать его как подмодуль git или через диспетчера пакетов (что позволит в зависимости от старых версий, что может быть плохо)?
Если бы я хотел обновить схему Пользователя, как бы я архивировал вещи, чтобы затем получить ошибки в двух сервисах, пока они не будут обновлены?
Для людей, которые используют protobuf, где вы храните эти файлы по отношению к двум сервисам? Могут ли ошибки протобуфа в реализациях?
Благодаря доступа, это полезно. Как вы обрабатываете недопустимый ввод в очереди? Рабочие не могут вернуть код ошибки клиенту, который включил это сообщение. –
Можете ли вы выслать мне ссылку на # 2? Я не уверен, что вы имеете в виду. –
@SeanClarkHess - в какой очереди вы используете?В истинном микро-сервисе я ожидаю, что вы либо используете такую услугу, как AWS SES, либо Azure Queues, либо вы внедрили свою собственную услугу –