Nhà xuất bản

Toàn bộ mã nguồn: github.com/ThreeDotsLabs/watermill/message/pubsub.go

// ...
type Publisher interface {
	// Publish công bố các thông điệp cung cấp cho chủ đề đã cho.
	//
	// Publish có thể là đồng bộ hoặc bất đồng bộ - tùy thuộc vào triển khai.
	//
	// Hầu hết các triển khai của nhà xuất bản không hỗ trợ công bố thông điệp nguyên tử.
	// Điều này có nghĩa là nếu công bố một trong các thông điệp thất bại, thông điệp tiếp theo sẽ không được công bố.
	//
	// Publish phải được an toàn cho luồng.
	Publish(topic string, messages ...*Message) error
	// Nếu nhà xuất bản là bất đồng bộ, Close nên xả các thông điệp chưa gửi.
	Close() error
}
// ...

Công Bố Nhiều Thông Điệp

Hầu hết các triển khai của nhà xuất bản không hỗ trợ công bố thông điệp nguyên tử. Điều này có nghĩa là nếu công bố một trong các thông điệp thất bại, thông điệp tiếp theo sẽ không được công bố.

Công Bố Bất Đồng bộ

Công bố có thể là đồng bộ hoặc bất đồng bộ - tùy thuộc vào triển khai.

Close()

Nếu nhà xuất bản là bất đồng bộ, Close nên xả các thông điệp chưa gửi. Đừng quên đóng các người đăng ký. Nếu không, bạn có thể mất một số thông điệp.

Người đăng ký

Toàn bộ mã nguồn: github.com/ThreeDotsLabs/watermill/message/pubsub.go

// ...
type Subscriber interface {
	// Subscribe trả về một kênh đầu ra với các thông điệp từ chủ đề đã cung cấp.
	// Kênh sẽ đóng khi Close() trên người đăng ký được gọi.
	//
	// Để nhận thông điệp tiếp theo, `Ack()` phải được gọi trên thông điệp nhận được.
	// Nếu quá trình xử lý thông điệp thất bại và thông điệp cần được gửi lại, `Nack()` nên được gọi.
	//
	// Khi ctx đã cung cấp bị hủy, người đăng ký sẽ đóng đăng ký và đóng kênh đầu ra.
	// Ctx cung cấp được đặt cho tất cả các thông điệp được tạo ra.
	// Khi Ack hoặc Nack được gọi trên thông điệp, ngữ cảnh của thông điệp sẽ bị hủy.
	Subscribe(ctx context.Context, topic string) (
}

Cơ chế Ack/Nack

Các người đăng ký chịu trách nhiệm xử lý AckNack từ các thông điệp. Việc triển khai đúng đắn nên đợi Ack hoặc Nack trước khi tiêu thụ thông điệp tiếp theo.

Mẹo triển khai quan trọng của người đăng ký: Rất quan trọng để gửi Ack/offset đến bộ lưu trữ/thiết bị của thông điệp sau Ack từ thông điệp Watermill. Nếu không, nếu quá trình chết trước khi xử lý thông điệp, có thể mất thông điệp.

Close()

Close sẽ đóng tất cả các đăng ký và kênh đầu ra của chúng, và xả offset nếu cần.

Giao Nhận Ít Nhất Một Lần

Watermill được xây dựng bằng cách sử dụng ngữ nghĩa giao nhận ít nhất một lần. Điều này có nghĩa là nếu xảy ra lỗi khi xử lý một thông điệp và không thể gửi Ack, thông điệp sẽ được gửi lại.

Bạn cần nhớ điều này và xây dựng ứng dụng của bạn cho việc xử lý cộng đồng hoặc triển khai cơ chế thử lại.

Rất tiếc, việc tạo ra một middleware thử lại chung không phải là điều có thể, vì vậy chúng tôi khuyến khích bạn xây dựng triển khai của riêng bạn.

Kiểm Thử Chung

Mỗi Pub/Sub tương tự nhau ở hầu hết các khía cạnh. Để tránh việc viết các bài kiểm thử riêng cho mỗi triển khai Pub/Sub, chúng tôi đã tạo một bộ kiểm thử mà bất kỳ Pub/Sub nào cũng nên vượt qua.

Các kiểm thử này có thể được tìm thấy trong pubsub/tests/test_pubsub.go.

Triển khai tích hợp sẵn

Để kiểm tra các triển khai Pub/Sub có sẵn, vui lòng xem Pub/Sub được hỗ trợ.

Triển Khai Pub/Sub Tùy Biến

Để biết hướng dẫn về việc hỗ trợ một triển khai Pub/Sub mới, vui lòng tham khảo "Triển Khai Pub/Sub Tùy Biến".