Tôi có một ứng dụng phản ứng với các tin nhắn được gửi bởi khách hàng. Một thông báo là reload_credentials
, rằng ứng dụng sẽ nhận được bất kỳ lúc nào khách hàng mới đăng ký. Thông báo này sau đó sẽ kết nối với một cơ sở dữ liệu PostgreSQL, thực hiện truy vấn cho tất cả các thông tin đăng nhập, và sau đó lưu trữ chúng trong một băm Ruby thông thường (client_id => client_token).Tôi nên xử lý trường hợp sử dụng này bằng EventMachine như thế nào?
Một số thông báo khác mà ứng dụng có thể nhận được là start
, stop
, pause
được sử dụng để theo dõi một số lần phiên. Quan điểm của tôi là tôi mường tượng các ứng dụng hoạt động theo cách sau:
- client gửi một thông điệp
- nhắn được xếp hàng đợi
- hàng đợi đang được xử lý
Tuy nhiên, ví dụ, tôi don không muốn chặn lò phản ứng. Hơn nữa, hãy tưởng tượng tôi có một tin nhắn reload_credentials
tiếp theo trong hàng đợi. Tôi không muốn bất kỳ thư nào khác từ hàng đợi được xử lý cho đến khi thông tin đăng nhập được tải lại từ DB. Ngoài ra, trong khi tôi đang xử lý một thông báo nhất định (như chờ truy vấn thông tin xác thực kết thúc), tôi muốn cho phép các thư khác được enqueued.
Bạn có thể hướng dẫn tôi giải quyết vấn đề như vậy không? Tôi nghĩ tôi có thể phải sử dụng em-synchrony
, nhưng tôi không chắc chắn.
Tuy nhiên, có thể nhận được thông báo reload_credentials nhiều lần. Không nên có 2 chủ đề? Một trong đó giữ xếp hàng và một trong đó là xử lý? – Geo
Có, nếu reload_credentials được nhận trong khi một reload_credential khác đang được xử lý, nó sẽ được xếp hàng đợi như các tin nhắn khác. – simulacre
Nhiều đoạn tải lại reload_credentials phải được xử lý như lần đầu tiên. Bằng cách đặt reload_credentials trong một khối EM.defer bạn đang thực thi nó trong một luồng khác. Miễn là mã 'đang xử lý' của bạn không bị chặn, bạn sẽ tiếp tục nhận được tin nhắn. Sử dụng thư viện tương thích EM để đảm bảo bạn không chặn. Hoặc sử dụng EM.defer để xử lý. – simulacre