Издатель
Полный исходный код: github.com/ThreeDotsLabs/watermill/message/pubsub.go
// ...
type Publisher interface {
// Publish публикует предоставленные сообщения в указанную тему.
//
// Публикация может быть синхронной или асинхронной - это зависит от реализации.
//
// Большинство реализаций издателей не поддерживают атомарную публикацию сообщений.
// Это означает, что если публикация одного из сообщений завершится ошибкой, следующее не будет опубликовано.
//
// Publish должен быть потокобезопасным.
Publish(topic string, messages ...*Message) error
// Если издатель асинхронный, Close должен сбросить неотправленные сообщения.
Close() error
}
// ...
Публикация нескольких сообщений
Большинство реализаций издателей не поддерживают атомарную публикацию сообщений. Это означает, что если публикация одного из сообщений завершится ошибкой, следующее не будет опубликовано.
Асинхронная публикация
Публикация может быть синхронной или асинхронной - это зависит от реализации.
Close()
Если издатель асинхронный, Close
должен сбросить неотправленные сообщения. Не забудьте закрыть подписчиков. Иначе возможна потеря части сообщений.
Подписчик
Полный исходный код: github.com/ThreeDotsLabs/watermill/message/pubsub.go
// ...
type Subscriber interface {
// Subscribe возвращает выходной канал с сообщениями из указанной темы.
// Канал закроется, когда будет вызван Close() на подписчике.
//
// Для получения следующего сообщения необходимо вызвать `Ack()` для полученного сообщения.
// Если обработка сообщения завершится с ошибкой и сообщение должно быть повторно доставлено, должен быть вызван `Nack()`.
//
// Когда предоставленный ctx отменен, подписчик закроет подписку и закроет выходной канал.
// Предоставленный ctx установлен для всех созданных сообщений.
// Когда вызывается `Ack` или `Nack` для сообщения, контекст сообщения будет отменен.
Subscribe(ctx context.Context, topic string) (
}
Механизм Ack/Nack
Подписчики несут ответственность за обработку Ack
и Nack
из сообщений. Правильная реализация должна ожидать Ack
или Nack
перед обработкой следующего сообщения.
Важный совет по реализации подписчика: Критически важно отправлять Ack/смещение в хранилище/агент сообщений после Ack из сообщения Watermill. В противном случае, если процесс прекращается перед обработкой сообщения, существует возможность потери сообщения.
Close()
Close
закроет все подписки и их выходные каналы, а также сбросит смещения, если это необходимо.
Не менее один раз доставка
Watermill построен с использованием семантики "не менее одного раза доставка". Это означает, что если происходит ошибка при обработке сообщения и невозможно отправить Ack
, сообщение будет повторно доставлено.
Вы должны иметь в виду это и выполнять построение вашего приложения для идемпотентной обработки или реализовать механизм повторной попытки.
К сожалению, создание общего промежуточного программного обеспечения для повторной попытки невозможно, поэтому мы настоятельно рекомендуем вам создать собственную реализацию.
Общее тестирование
Каждый Pub/Sub похож в большинстве аспектов. Чтобы избежать написания отдельных тестов для каждой реализации Pub/Sub, у нас есть набор тестов, который должен пройти любой Pub/Sub.
Эти тесты можно найти в pubsub/tests/test_pubsub.go
.
Встроенная реализация
Чтобы проверить доступные реализации Pub/Sub, обратитесь к поддерживаемым Pub/Sub.
Реализация пользовательского Pub/Sub
Для инструкций по внедрению поддержки нового Pub/Sub обратитесь к "Реализация пользовательского Pub/Sub".