2013-08-23 31 views
10

Tôi hiện đang làm việc trên một dịch vụ REST cho phép kiểm soát và giám sát một số thiết bị vật lý.Triển khai WebHooks với ServiceStack

API REST tương ứng chủ yếu dựa trên các nguyên tắc và ý tưởng bạn có thể tìm thấy trong bài viết sau: "Controlling and Monitoring Devices with REST".

Thiết bị được giám sát và kiểm soát có thể tạo ra một số sự kiện mà khách hàng phải có thể đăng ký. Ý tưởng của tôi là triển khai phần đó bằng cách sử dụng RESTful WebHooks.

Vì vậy, bất cứ khi nào một sự kiện phát sinh, dịch vụ của tôi thực hiện gọi lại API REST cho từng người đăng ký để thông báo cho họ.

Câu hỏi của tôi, bây giờ:

Điều gì sẽ là một cách thích hợp để thực hiện kịch bản này sử dụng ServiceStack (phiên bản 3.9.71)?

Dịch vụ của tôi phải có thể xếp hàng đăng ký và gửi các sự kiện cho người đăng ký. Nó cũng phải đối phó với các tình huống mà khách hàng không hoạt động hoặc không thể truy cập và có khả năng thử gửi lại thông báo.

Tôi có phải triển khai mọi thứ từ đầu (sử dụng, ví dụ: ServiceStack được lưu trữ RedisMqServer) hoặc có điều gì đó đi xa hơn về hướng của tôi không? Tôi đã googled xung quanh mà không có nhiều thành công.

Trả lời

5

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à:

  1. 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
  2. Ứng dụng này sau đó sẽ kết nối với EventsQueue và xử lý các thông điệp theo:
    1. Tìm ra những người đã đăng ký sự kiện đặc biệt này
    2. Đố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ệ)
  3. 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đ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.

1

ServiceStack.Webhooks là một khuôn khổ mới để dễ dàng thêm webhook vào dịch vụ của bạn, bất kể bạn đang sử dụng mẫu kiến ​​trúc nào. Bạn chỉ có thể tạo plugin của riêng mình.

Các vấn đề liên quan