Tôi đang tìm một số đầu vào về cách mở rộng một Dịch vụ Windows hiện đang chạy tại công ty của tôi. Chúng tôi đang sử dụng .NET 4.0 (có thể và sẽ được nâng cấp lên 4.5 tại một số điểm trong tương lai) và chạy trên Windows Server 2012.Mở rộng các Dịch vụ Windows
Giới thiệu về dịch vụ
công việc của dịch vụ là để truy vấn cho các hàng mới trong một bảng ghi (Chúng tôi đang làm việc với một cơ sở dữ liệu Oracle), xử lý thông tin, tạo và/hoặc cập nhật một loạt các hàng trong 5 bảng khác (hãy gọi chúng là bảng Theo dõi), cập nhật bảng ghi và lặp lại.
Bảng ghi nhật ký có số lượng lớn XML (có thể lên tới 20 MB mỗi hàng) cần được chọn và lưu trong 5 bảng Theo dõi khác. Hàng mới được thêm vào tất cả các thời gian ở tốc độ tối đa 500.000 hàng một giờ.
Lưu lượng truy cập của bảng Theo dõi cao hơn nhiều, từ 90.000 hàng mới trong hàng nhỏ nhất đến hàng triệu hàng tiềm năng trong bảng lớn nhất, mỗi giờ. Chưa kể rằng có các hoạt động Cập nhật trên các bảng đó.
Giới thiệu về dữ liệu đang được xử lý
tôi cảm thấy chút này là rất quan trọng cho việc tìm kiếm một giải pháp dựa trên cách thức các đối tượng này được nhóm lại và xử lý. Cấu trúc dữ liệu trông như thế này:
public class Report
{
public long Id { get; set; }
public DateTime CreateTime { get; set; }
public Guid MessageId { get; set; }
public string XmlData { get; set; }
}
public class Message
{
public Guid Id { get; set; }
}
- Báo cáo là dữ liệu khai thác gỗ tôi cần phải lựa chọn và quá trình
- Đối với mỗi tin nhắn có trung bình 5 Báo cáo. Điều này có thể thay đổi từ 1 đến hàng trăm trong một số trường hợp.
- Thư có một loạt các bộ sưu tập khác và các mối quan hệ khác, nhưng chúng không liên quan đến câu hỏi.
Ngày nay, dịch vụ Windows chúng ta có hầu như không quản lý tải trên một máy chủ 16 lõi (tôi không nhớ đầy đủ các thông số kỹ thuật, nhưng nó an toàn để nói máy này là một con quái vật). Tôi đã được giao nhiệm vụ tìm cách mở rộng quy mô và thêm nhiều máy hơn để xử lý tất cả dữ liệu này và không can thiệp vào các trường hợp khác.
Hiện tại, mỗi Tin nhắn đều nhận được Chủ đề riêng và xử lý các báo cáo có liên quan. Chúng tôi xử lý các báo cáo theo lô, được nhóm theo MessageId của họ để giảm số lượng truy vấn DB xuống mức tối thiểu khi xử lý dữ liệu.
Hạn chế
- Ở giai đoạn này tôi được phép viết lại dịch vụ này từ đầu sử dụng bất kỳ kiến trúc tôi thấy phù hợp.
- Nếu một sự cố xảy ra, các trường hợp khác cần phải có khả năng tiếp nhận vị trí bị hỏng. Không có dữ liệu nào có thể bị mất.
- Quá trình xử lý này cần càng gần thời gian thực càng tốt từ các báo cáo được chèn vào cơ sở dữ liệu.
Tôi đang tìm bất kỳ đầu vào hoặc tư vấn về làm thế nào để xây dựng một dự án như vậy. Tôi cho rằng các dịch vụ sẽ cần phải là không trạng thái, hoặc có cách nào để đồng bộ hóa bộ đệm cho tất cả các trường hợp bằng cách nào đó không? Tôi nên phối hợp giữa tất cả các trường hợp như thế nào và đảm bảo chúng không xử lý cùng một dữ liệu?Làm thế nào tôi có thể phân phối tải như nhau giữa chúng? Và tất nhiên, làm thế nào để xử lý một trường hợp bị rơi và không hoàn thành công việc của nó?
EDIT
Removed thông tin không liên quan
Điều này * có vẻ * giống như quy trình ETL. Bạn đã xem xét việc xem xét một cái gì đó giống như SQL Server Integration Services (SSIS) và viết các gói có thể được lên lịch để chạy thường xuyên thực hiện quá trình này? –
Chúng tôi sử dụng Oracle và up cao hơn không muốn nghe một từ về SQL Server, thật không may. – Artless
Tôi đã suy nghĩ chỉ là một phần SSIS của nó và không phải là công cụ cơ sở dữ liệu :) Các lựa chọn thay thế sẽ là một cái gì đó giống như tích hợp dữ liệu Pentaho (http://www.pentaho.com/explore/pentaho-data-integration/) hoặc phân tích Talend etl (http://www.talend.com/solutions/etl-analytics) –