Tôi tin rằng bạn đang tiếp cận giải pháp từ đầu sai. Bạn chắc chắn có thể sử dụng ServiceStack để thực hiện các cuộc gọi Web Hook - tốt nhất là trong JSON.
Điều bạn thực sự cần xem xét là Hàng đợi thư, vì chúng thể hiện tất cả các đặc tính bạn cần để thực hiện cuộc gọi Web Hook (độ bền, chính sách xóa thư, lọc thư, chính sách phân phối, chính sách định tuyến, tiêu chí xếp hàng)
Read more about the properties of message queues on Wikipedia
các quy trình làm việc một sự kiện sẽ đi theo lên đến điểm mà một Hook Web được gọi là:
- một sự kiện xảy ra trong hệ thống; để đảm bảo một Hook Web sẽ được gọi, bạn phải từ lâu enqueue sự kiện để xử lý (thông qua một Service Bus như RabbitMq, MassTransit, NServiceBus, vv). Hãy gọi hàng đợi mục tiêu EventsQueue
- Ứng dụng này sau đó sẽ kết nối với EventsQueue và xử lý các thông điệp theo:
- Tìm ra những người đã đăng ký sự kiện đặc biệt này
- Đối mỗi thuê bao enqueue một thư mới chứa bản sao dữ liệu sự kiện và chi tiết người đăng ký (ví dụ: URL gọi lại) đến WebHookQueue với Thời gian phát trực tiếp ban đầu (thời lượng tin nhắn hợp lệ)
- Sau đó, ứng dụng sẽ kết nối với WebHookQueue và xử lý thư bằng cách thực hiện cuộc gọi lại.
Vì vậy, bây giờ bạn có một hệ thống thông báo cơ bản phải đảm bảo thư được gửi ít nhất một lần.
Here's a great article detailing how to use TTL (Time To Live) to retry messages at intervals
tôi sẽ tham gia một cách tiếp cận hơi khác nhau:.
- Tạo hàng đợi mức retry khác nhau (ví dụ WebHookRetryQueue = WebHookQueue 's hàng đợi thư chết, WebHookRetryLvl1Queue = TTL 5 phút, WebHookRetryLvl2Queue = TTL 15 phút). Bí quyết là để thiết lập những thử lại hàng đợi thư chết hàng đợi cấp cho WebHookQueue và điệp nghỉ enqueued hết hạn (có nghĩa là khi một thông điệp hết hạn vào một hàng đợi mức retry, nó enqueued trở lại vào WebHookQueue).
- Sau đó, bạn sẽ cần phải theo dõi các hiện retry mức trên các thông điệp trong WebHookRetryQueue và sau đó enqueue thông điệp trên hàng đợi mức retry thích hợp - whereafter TTL hết hạn, bị đưa trở lại WebHookQueue .
Ví dụ Workflow: WebHookQueue với Max Retry: 2, TTL: 1 ngày
Ví dụ nhắn: { 'EVENT_TYPE': 'Email_Reply', 'callback_url':' ... ',' reply_level ': 0,' queueued_at ':' 2013-09-25T22: 00: 00Z ', dữ liệu:' json được mã hóa '}
Thư -> WebHookQueue (không) -> WebHookQueue (không) -> WebHookRetryQueue (incr. Reply_level = 1 + enqueue) -> WebHookRetryLvl1Queue (5 phút hết hạn) -> WebHookQueue (lỗi) -> WebHookQueue (lỗi) -> WebHookRetryQueue (incr. reply_level = 2 + enqueue) -> WebHookRetryLvl2Queue (15 phút-hết hạn) -> WebHookQueue (thất bại) -> WebHookQueue (thất bại) -> WebHookRetryQueue (thả nhắn)
Sửa
Click here to look at simple example using a WebHookQueue and a WebHookRetryQueue using message level TTL's of RabbitMQ. Do đến mức tin nhắn TTL; không nhất thiết phải tạo các hàng đợi Thử lại mức khác nhau - có thể cần thiết cho hàng đợi tin nhắn ít nổi bật hơn.
Nếu bạn đã phải thực hiện một hàng đợi như vậy với khả năng hết hạn thông điệp cá nhân (không thông qua thanh lọc chính sách) hoặc tin nhắn lịch trước thời hạn với các tùy chọn để sắp xếp lại/hết hạn - bạn sẽ rất có thể đã phải lựa chọn cho xếp hàng dựa trên cơ sở dữ liệu.
Here's a great article on CodeProject on building such a high performance queue for MSSQL Server (portable để cơ sở dữ liệu khác như MySql/PostgreSQL/MongoDB/Couchbase, vv với nỗ lực)
Hy vọng bạn tìm thấy thông tin này hữu ích.