Chúng tôi xử lý tin nhắn thông qua nhiều dịch vụ khác nhau (một tin nhắn sẽ chạm vào 9 dịch vụ trước khi hoàn thành, mỗi dịch vụ thực hiện một chức năng liên quan đến IO cụ thể). Ngay bây giờ chúng tôi có sự kết hợp giữa trường hợp xấu nhất (tuần tự hóa hợp đồng dữ liệu XML) và trường hợp tốt nhất (MSMQ trong bộ nhớ) để thực hiện.
Bản chất của tin nhắn có nghĩa là dữ liệu tuần tự của chúng tôi kết thúc khoảng 12-15 kilobyte và chúng tôi xử lý khoảng 4 triệu tin nhắn mỗi tuần. Các tin nhắn liên tục trong MSMQ quá chậm đối với chúng tôi và khi dữ liệu tăng lên, chúng tôi cảm thấy áp lực từ các tệp ánh xạ bộ nhớ của MSMQ. Máy chủ đang ở mức 16GB sử dụng bộ nhớ và đang phát triển, chỉ để xếp hàng. Hiệu suất cũng bị giảm khi sử dụng bộ nhớ cao, vì máy bắt đầu hoán đổi. Chúng tôi đã thực hiện hành vi tự dọn dẹp MSMQ.
Tôi cảm thấy như có một phần chúng ta đang làm sai ở đây. Tôi đã thử sử dụng RavenDB để duy trì các tin nhắn và chỉ xếp hàng một mã định danh, nhưng hiệu suất ở đó rất chậm (tối đa 1000 tin nhắn mỗi phút). Tôi không chắc đó có phải là kết quả của việc sử dụng phiên bản phát triển hay không, nhưng chúng tôi chắc chắn cần thông lượng cao hơn [1]. Khái niệm này hoạt động rất tốt trong lý thuyết nhưng hiệu suất không theo nhiệm vụ.
Mẫu sử dụng có một dịch vụ hoạt động như một bộ định tuyến, tất cả đều đọc. Các dịch vụ khác sẽ đính kèm thông tin dựa trên móc bên thứ 3 của họ và chuyển tiếp trở lại bộ định tuyến. Hầu hết các đối tượng được chạm 9-12 lần, mặc dù khoảng 10% bị buộc phải lặp đi lặp lại trong hệ thống này trong một thời gian cho đến khi các bên thứ 3 phản hồi thích hợp. Các dịch vụ ngay bây giờ giải thích cho điều này và có hành vi ngủ thích hợp, vì chúng tôi sử dụng lĩnh vực ưu tiên của tin nhắn vì lý do này.
Vì vậy, câu hỏi của tôi, một ngăn xếp lý tưởng cho thông điệp truyền giữa các máy rời rạc nhưng trong môi trường C # / Windows là gì? Tôi thường bắt đầu với BinaryFormatter thay vì tuần tự hóa XML, nhưng đó là một lỗ thỏ nếu cách tốt hơn là giảm tải tuần tự hóa vào kho lưu trữ tài liệu. Do đó, câu hỏi của tôi.
[1]: Bản chất kinh doanh của chúng tôi có nghĩa là chúng tôi xử lý tin nhắn càng sớm, chúng tôi càng kiếm được nhiều tiền. Chúng tôi đã chứng minh bằng thực nghiệm rằng việc xử lý một tin nhắn vào cuối tuần có nghĩa là chúng tôi ít có khả năng kiếm được số tiền đó. Mặc dù hiệu suất của "1000 mỗi phút" nghe có vẻ nhanh, nhưng chúng tôi thực sự cần con số đó lên tới 10k / phút. Chỉ vì tôi đưa ra số trong tin nhắn mỗi tuần không có nghĩa là chúng tôi có cả tuần để xử lý những tin nhắn đó.
=============== chỉnh sửa:
Thông tin thêm
Dựa trên các ý kiến, tôi sẽ thêm một số làm rõ:
Tôi không chắc chắn việc xê-ri hóa là nút cổ chai của chúng tôi. Tôi đã chấm điểm cho ứng dụng và trong khi tuần tự hóa xuất hiện trong biểu đồ nhiệt, nó chỉ chịu trách nhiệm cho khoảng 2,5-3% mức sử dụng CPU của dịch vụ.
Tôi chủ yếu quan tâm đến sự lâu dài của các thông điệp của chúng tôi và việc lạm dụng MSMQ tiềm ẩn. Chúng tôi đang sử dụng các tin nhắn không giao dịch, không liên tục để chúng tôi có thể tiếp tục thực hiện hàng đợi và tôi thực sự muốn có ít nhất các tin nhắn liên tục để chúng tồn tại khi khởi động lại.
Thêm RAM là một biện pháp ngăn chặn. Máy đã đi từ 4GB -> 16GB RAM và càng ngày càng khó để hạ nó xuống để tiếp tục bổ sung thêm.
Do mô hình định tuyến sao của ứng dụng, một nửa thời gian một đối tượng được bật lên sau đó được đẩy vào hàng đợi, nó hoàn toàn không thay đổi. Điều này cho vay một lần nữa (IMO) để lưu trữ nó trong một số loại lưu trữ khóa-giá trị ở nơi khác và chỉ cần chuyển định danh thư.
Mẫu định tuyến sao là không thể thiếu đối với ứng dụng và sẽ không thay đổi. Chúng tôi không thể ứng dụng rết nó vì mọi phần trên đường vận hành không đồng bộ (theo kiểu bỏ phiếu) và chúng tôi muốn tập trung hành vi thử lại ở một nơi.
Logic ứng dụng được viết bằng C #, các đối tượng là các POCO bất biến, môi trường triển khai mục tiêu là Windows Server 2012 và chúng tôi được phép đứng lên các máy bổ sung nếu một phần mềm cụ thể chỉ được hỗ trợ trong Linux.
Mục tiêu của tôi là duy trì thông lượng hiện tại trong khi giảm dung lượng bộ nhớ và tăng khả năng chịu lỗi với số vốn tối thiểu.