2015-02-16 15 views
5

Im xây dựng một ứng dụng OO PHP sẽ chạy trên nhiều nút và sẽ tương đối không có quốc tịch và tôi cần triển khai đúng nhà xuất bản (http://en.wikipedia.org/wiki/Observer_pattern/http://sourcemaking.com/design_patterns/Observer/php) sự kiện kiểu.Sự kiện nhiều nút liên tục trong một ứng dụng web không quốc tịch trong PHP

Câu hỏi của tôi là, làm cách nào để xử lý sự kiện?

Trong ứng dụng của mình, chúng tôi đang sử dụng các công nghệ như Cassandra, Redis, Mongo và RabbitMQ.

Tôi biết PHP có sự kiện EXTENSION có sẵn, nhưng từ những gì tôi có thể nói nó nằm trong trạng thái - hoặc nếu như memcached được thừa hưởng, nó có thể được sử dụng trong nút đó ... nhưng ứng dụng của tôi sẽ được phân phối trên nhiều nút.

Vì vậy, hãy xem ví dụ: Trên nút 1, chỉ số (ID số 37) được cập nhật và mọi thứ đăng ký số liệu đó cần phải được cập nhật. Điều này xuất bản thay đổi và thay đổi khi nó cập nhật.

Tôi có nội dung được đăng ký ID số liệu 37 đang được cập nhật, ví dụ: Số liệu 38, có thể cần tính toán lại chính nó khi giá trị của số liệu thay đổi.

Số liệu 38 hiện được khởi tạo và được sử dụng trên nút 2 trong quy trình ID 1011 ... Chỉ số 37 cho chỉ số 38 trên nút 2 (Process ID 1011 trong trường hợp này) để chạy chức năng đã đăng ký như thế nào?

Số liệu 39 đăng ký vào Số liệu 38 đang được cập nhật, nhưng không được khởi tạo ở bất kỳ đâu ... Làm cách nào để cập nhật số liệu 39 khi Số liệu 38 hoàn tất cập nhật? Tôi đã nghĩ đến một cái gì đó như sử dụng RabbitMQ làm người quản lý hàng đợi sự kiện của tôi, và trên mỗi nút có một ứng dụng 'người tiêu dùng sự kiện' phong cách daemon đọc các sự kiện trong hàng đợi sự kiện (để cân bằng tải/phân phối tác phẩm) .

Sau đó, người tiêu dùng thấy "Số liệu: 38: Cập nhật", nó sẽ kiểm tra thứ gì đó như Redis cho bất kỳ thứ gì đã đăng ký "Metric: 38: Updated" và nhận giá trị ("What: Function: Values") và thực hiện điều gì đó như call_user_func_array (mảng ($ what, $ function), $ values); .... nhưng điều này có vẻ như nó có thể gây ra một gánh nặng của chi phí và một số mức độ của các vấn đề đồng bộ hóa ...

Tôi đang sử dụng Doctrine MongoDB ODM để duy trì các đối tượng của mình ... Để xử lý các vấn đề đồng bộ hóa mà tôi đã nghĩ đến một cái gì đó như thế này: Đối tượng có thể có số phiên bản ... (phiên bản = 1.0) Và redis có thể được sử dụng để duy trì tham chiếu nhanh đến phiên bản mới nhất của đối tượng (ObjectVersion: ObjectType: ObjectId) = 1.1 Và khi getter được gọi trên một thuộc tính đối tượng được đánh dấu là @critical (những thứ như isDeleted, số dư tiền tệ, v.v.) có thể kiểm tra xem ID phiên bản của cá thể có bằng phiên bản # trong redis và cập nhật các giá trị của nó từ mongo nếu nó cần .. .

Thiết lập thay thế đang sử dụng amphp/amp (http://amphp.org/docs/amp/reactor-concepts.html) và một số hình thức RPC để đồng bộ hóa các nút

Vì tôi khá mới phát triển web (di chuyển từ C#) và không quốc tịch và phân phối .. Tôi nghĩ đó sẽ là ý tưởng tốt để hỏi cộng đồng nếu có ai có đề xuất tốt hơn?

+0

"Tôi biết PHP có hệ thống sự kiện" Có phải không? Bạn có thể làm rõ những gì bạn đang đề cập đến? – Brad

+0

Xin lỗi, tôi cần phải có một tham chiếu đến http://php.net/manual/en/book.event.php – ChaosAffe

+3

Ah, vâng đó là một phần mở rộng và không thực sự là một phần của PHP. – Brad

Trả lời

0

có thể là một midware nên cần thiết, như http://redis.io/topics/pubsub hoặc một số hàng đợi thông điệp như khác có thể hỗ trợ ứng dụng của bạn

1

Câu hỏi của tôi là, làm thế nào tôi có thể xử lý các sự kiện?

Nếu bạn muốn sử dụng một thực hiện vòng lặp sự kiện, có rất nhiều lựa chọn có sẵn:

Bạn có thể sử dụng một hệ thống PubSub như Redis cung cấp: http://redis.io/topics/pubsub. Amp cung cấp package for Redis, các thư viện sự kiện khác có thể đã có sẵn triển khai.

Redis sẽ gửi thông báo sự kiện tới tất cả khách hàng được kết nối và nghe. Bạn có thể không muốn điều đó, bởi vì bạn muốn đồng bộ hóa các phép tính của bạn và thực hiện chúng chỉ một lần.

Bạn có thể đẩy dữ liệu thực tế vào danh sách Redis và chỉ sử dụng hệ thống sự kiện để thăm dò ý kiến ​​trong trường hợp có công việc mới, do đó người lao động có thể ngủ. Một giải pháp tốt hơn có thể là sử dụng các hoạt động danh sách chặn, chặn một kết nối Redis cho đến khi có dữ liệu mới trong danh sách Redis. Khi sự kiện đó xảy ra, bạn có thể tính lại giá trị và đẩy cập nhật cho sự kiện.

Về cơ bản, việc xây dựng hàng đợi thư với Redis, nhưng về cơ bản bạn sẽ chỉ muốn xem các tính năng của các triển khai hàng đợi thư khác nhau và xem chúng có phù hợp với nhu cầu của bạn hay không. Nếu bạn muốn sử dụng bất kỳ thư viện vòng lặp sự kiện nào, bạn cũng có thể muốn xem các máy khách có sẵn và các tính năng khác mà bạn cần từ chúng, vì chúng thường không tương thích (chưa).

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