2012-08-27 36 views
8

Tôi đang suy nghĩ về hệ thống sẽ thông báo cho nhiều người tiêu dùng về các sự kiện xảy ra với một tập hợp các đối tượng. Mỗi thuê bao sẽ có thể đăng ký các sự kiện xảy ra với số không hoặc nhiều đối tượng, nhiều người đăng ký sẽ có thể nhận thông tin về các sự kiện xảy ra với một đối tượng duy nhất.Giải pháp xếp hàng đợi tin nhắn cho hàng triệu chủ đề

Tôi nghĩ rằng một số hệ thống xếp hàng thư sẽ phù hợp trong trường hợp này nhưng tôi không biết cách xử lý thực tế là tôi sẽ có hàng triệu đối tượng - sử dụng chủ đề riêng cho mỗi đối tượng không tốt [hoặc nó chỉ là tốt?].

Bạn có thể đề xuất phương pháp tiếp cận mà tôi nên thực hiện và thậm chí có thể một số hệ thống xếp hàng tin nhắn nguồn mở hợp lý không?

ít biết thêm chi tiết:

  • sẽ có hàng ngàn thuê bao [nghĩa là không nhiều trong số họ],
  • thuê bao sẽ đăng ký hàng chục hoặc hàng trăm đối tượng từng,
  • sẽ có ~ 5 -20 triệu trong số các đối tượng,
  • sự kiện không phải mang theo bất kỳ thông điệp nào. chỉ là thông tin mà đối tượng đã được thay đổi là đủ,
  • đại đa số đối tượng sẽ không bao giờ được đăng ký,
  • sự kiện xảy ra ở mức tối đa vài trăm mỗi giây,
  • lý tưởng là máy chủ nên chạy dưới Linux, được có thể tích hợp với phần còn lại của hệ sinh thái thông qua http long-poll [sử dụng nút js? tiếp tục dưới cầu cảng?].

Cảm ơn trước cho phản hồi của bạn và xin lỗi vì câu hỏi hơi mơ hồ!

+1

Đây là vấn đề cơ bản khó giải quyết theo cách có thể mở rộng, được minh chứng - ví dụ - bởi các vấn đề mà Twitter đã gặp phải. Bạn có thể sử dụng mô hình chủ đề người đăng ký tiêu chuẩn và sử dụng mẹo để giới hạn số lượng chủ đề: Ví dụ: id chủ đề có thể là id tin nhắn modulo 1000. Sau đó, người nghe của chủ đề sẽ chỉ lọc các thư họ quan tâm trong khoảng. (Chỉ là một ý tưởng) –

+0

@Aapo Kyrola - cảm ơn vì gợi ý. bạn có thể vui lòng gửi bình luận của bạn như là câu trả lời? cũng có thể bạn có thể đề xuất máy chủ xếp hàng tin nhắn cụ thể? – pQd

+0

bạn đã xem http://aws.amazon.com/sqs/ chưa? Và ở tất cả các công cụ mà họ có thể cung cấp (thông báo, vv) – Resh32

Trả lời

3

Chia nhỏ chủ đề để thực hiện các sự kiện cụ thể cho ví dụ: "Đối tượng cập nhật đối tượng" "Đối tượng đã bị xóa" ... Vì vậy, khách hàng chỉ cần phải đăng ký với "không hữu hạn:" của chủ đề dựa trên sự kiện mà họ quan tâm.

Tiêm tiêu đề vào thư khi bạn xuất bản và đưa trí thông minh vào các khách hàng để sử dụng các tiêu đề này làm bộ chọn tin nhắn. Ví dụ, client biết danh sách các đối tượng mà anh ta quan tâm - và nói rằng bạn xác định đối tượng bằng một "id" - id có thể là header, và client sẽ sử dụng "id header" để xác định xem anh ta có quan tâm không thông điệp.

Tùy thuộc vào việc bạn muốn, bạn cũng có thể cân nhắc việc đảm bảo phân phối được bảo đảm để đảm bảo rằng khách hàng sẽ nhận được tin nhắn ngay cả khi nó không trực tuyến và quay lại sau.

Các tùy chọn mà tôi muốn giới thiệu đỉnh đầu được ActiveMQ, RabbitMQ và Redis PUB SUB (havent thực sự làm việc trên redis quán rượu-sub, xin vui lòng sử dụng diligance do của bạn)

Cuối cùng đây là một số tiêu chuẩn hiệu suất cho RabbitMQRedis

Chỉ thấy rằng bạn chỉ có 100 tin nhắn bị đẩy ra/giây, đây không phải là vấn đề lớn đối với activemq, tôi đã sử dụng Amq trên hệ thống xử lý 240 thư mỗi giây và hoạt động tốt . Tôi sử dụng một nhóm công nhân để xử lý các thông điệp một cách không đồng bộ. Nhìn vào một khuôn khổ như akka nếu bạn đang ở trong vùng đất java, nếu không dính với nodejs và hệ thống Eco mát mẻ xung quanh nó.

2

Nếu nó đã được mã nguồn mở tôi muốn đi cho ActiveMQ, và một máy chủ ứng dụng để cung cấp các chức năng JMS cho các chủ đề và nó có Ajax Support để bạn có thể truy cập chúng từ khách hàng của bạn

Vì vậy, bạn sẽ sử dụng cơ sở hạ tầng JMS để xuất bản các chủ đề cho các đối tượng đó, và bạn can create topis as you need them

Ngoài ra, bằng cách sử dụng máy chủ ứng dụng java, bạn có thể tận dụng lợi thế từ phân cụm, cân bằng tải và các tính năng sẵn sàng cao khác (rõ ràng dựa trên sản phẩm đã chọn))

Hy vọng sẽ giúp !!!

+0

ActiveMQ có thể xử lý hàng triệu chủ đề không? – pQd

+0

Tôi sẽ đoán như vậy, tuy nhiên, nó không phải về các chủ đề rất nhiều về phần cứng của nó (một số CPU và chắc chắn rất nhiều RAM), và hệ điều hành underliying (số lượng kết nối tại bất kỳ thời điểm nào, ổ cắm/luồng và hạn chế của ngăn xếp TCP) –

+0

phải trung thực tôi đang tìm kiếm câu trả lời từ những người có kinh nghiệm với kích thước tương tự hơn là giả định rằng 'nó sẽ hoạt động'. Nhưng dù gì cũng cảm ơn. – pQd

5

Tôi rất khuyên bạn nên RabbitMQ. Tôi đã sử dụng nó trong một vài dự án trước và từ kinh nghiệm của tôi, tôi nghĩ rằng nó là rất đáng tin cậy và cung cấp một loạt các cấu hình. Về cơ bản, RabbitMQ là một nhà môi giới thông báo của open-source (Mozilla Public License (MPL)) thực hiện tiêu chuẩn Advanced Message Queuing Protocol (AMQP).

như được nêu trên RabbitMQ web-site:

RabbitMQ khả năng có thể chạy trên bất kỳ nền tảng mà Erlang hỗ trợ, từ các hệ thống nhúng đa lõi cụm và máy chủ dựa trên đám mây.

... có nghĩa là hệ điều hành như Linux được hỗ trợ.

Có một thư viện cho Node.js đây: https://github.com/squaremo/rabbit.js

Nó đi kèm với một API dựa HTTP cho việc quản lý và giám sát của máy chủ RabbitMQ - bao gồm một công cụ dòng lệnh và một trình duyệt dựa trên giao diện người dùng như tốt - xem: http://www.rabbitmq.com/management.html.

Trong các dự án tôi đã làm việc, tôi đã liên lạc với RabbitMQ bằng C# và hai trình bao bọc khác nhau, EasyNetQBurrow.NET. Cả hai đều là trình bao bọc tuyệt vời cho RabbitMQ nhưng tôi đã trở thành fan hâm mộ nhất của Burrow.NET vì nó dễ dàng hơn và rõ ràng hơn để làm việc (không làm nhiều phép thuật dưới mui xe) và cung cấp tính linh hoạt tốt để bơm logger, serializers, v.v.

Tôi chưa bao giờ làm việc với số lượng đối tượng mà bạn sẽ làm việc với - Tôi đã làm việc với hàng nghìn (không phải hàng triệu). Tuy nhiên, bất kể có bao nhiêu đồ vật tôi đã chơi cùng, RabbitMQ luôn hoạt động rất ổn định và chưa bao giờ là nguồn của lỗi trong hệ thống.

Vì vậy, để tổng hợp - RabbitMQ rất đơn giản để sử dụng và thiết lập, hỗ trợ AMQP, có thể được quản lý thông qua HTTP và những gì tôi thích nhất - đó là đá rắn.

1

Mặc dù không chắc chắn về môi trường làm việc của bạn nhưng dưới đây là các bit của tôi. Bạn có thể xác định từng đối tượng có ID duy nhất trong hệ thống của bạn không. Nếu có, bạn có thể có một chủ đề cho mỗi loại sự kiện. ví dụ: bạn muốn theo dõi sự kiện xóa đối tượng, sự kiện cập nhật đối tượng, v.v. Vì vậy, bạn có thể có chủ đề cho từng loại sự kiện. Những chủ đề này sẽ được xuất bản với Id của đối tượng bất cứ khi nào sự kiện tương ứng xảy ra với đối tượng. Điều này sẽ hạn chế không có chủ đề bạn cần. Phần thứ hai của vấn đề của bạn là những người đăng ký khác nhau muốn đăng ký các đối tượng khác nhau. Vì vậy, không phải tất cả người đăng ký đều quan tâm đến việc biết các sự kiện của tất cả các đối tượng. Báo cáo vấn đề này được đưa vào cơ chế chọn lọc (lọc) được cung cấp bởi khung thư. Vì vậy, về cơ bản bạn cần phải tìm kiếm trên cơ sở những gì một thuê bao quan tâm đến đối tượng cụ thể. Có cơ sở đó như một cơ chế lọc thư.Nó có thể là bất cứ điều gì: loại đối tượng, trạng thái đối tượng vv Vì vậy, cuối cùng hệ thống của bạn sẽ bao gồm một chủ đề cho từng loại sự kiện với một người nào đó xuất bản thông báo sự kiện: {object-type: object-id} information. Người đăng ký có thể đăng ký bất kỳ chủ đề nào và với tiêu chí lọc.

Nếu giải pháp trên thỏa mãn, bạn có thể sử dụng bất kỳ giải pháp nhắn tin nào: activeMQ, WMQ, RabbitMQ.

+0

tôi có thể xác định id toàn diện đối tượng. tôi không cần phải theo dõi những gì đã xảy ra; thông tin rằng một cái gì đó đã xảy ra là đủ, nó sẽ cho khách hàng để lấy các chi tiết đối tượng. thuê bao sẽ đăng ký [tương đối] các đối tượng rất ít. – pQd

2

Vì thư của bạn rất nhỏ có thể muốn xem xét MQTT, được thiết kế cho các thiết bị nhỏ, mặc dù nó hoạt động tốt trên các thiết bị mạnh mẽ. Key xem xét là chi phí thấp - về cơ bản là một tiêu đề 2 byte cho một tin nhắn nhỏ. Có thể bạn không thể sử dụng bất kỳ máy chủ MQTT đơn giản hoặc mã nguồn mở nào, do khối lượng của bạn. Bạn có thể cần một thiết bị chuyên dụng nặng như MessageSight để xử lý âm lượng của bạn.

Một số chi tiết khác về ứng dụng của bạn chắc chắn sẽ hữu ích. Ngoài ra bạn không đề cập đến an ninh ở tất cả. Tôi cho rằng bạn phải có một số nhu cầu trong lĩnh vực này.

+0

cảm ơn câu trả lời của bạn. thực sự nó sẽ là tất cả lưu lượng truy cập nội bộ giữa các quy trình/máy móc 'đáng tin cậy' - vì vậy không cần các tính năng bảo mật. – pQd

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