2009-04-24 57 views
5

Tôi có một ứng dụng hoạt động như sau: Máy Linux tạo ra 28 loại thư khác nhau cho khách hàng. Các chữ cái phải được gửi bằng .docx (định dạng Microsoft Word). Một thư ký duy trì các mẫu MS Word, được tự động sử dụng khi cần thiết. Thay đổi từ việc sử dụng MS Word không phải là một lựa chọn.thay thế cho cơ sở dữ liệu bỏ phiếu?

Để phối hợp tất cả điều này, công việc tài liệu được đặt vào bảng cơ sở dữ liệu và chương trình python chạy trên mỗi cửa sổ máy thăm dò cơ sở dữ liệu thường xuyên, khóa công việc và chạy chúng khi cần thiết.

Chúng tôi sử dụng bảng cơ sở dữ liệu trung tâm cho thông tin công việc để phối hợp các trạng thái khác nhau ("mới", "xử lý", "hoàn thành", "in") ... để cung cấp thông tin trạng thái chính xác.

Dù sao, tôi không thích khách hàng bỏ phiếu cho cơ sở dữ liệu thường xuyên, vì họ không làm việc hầu hết thời gian. Khách hàng hpoll mỗi 5 giây.

Để tránh bỏ phiếu, tôi muốn phát sóng "có một số việc phải làm" hoặc "kiểm tra cơ sở dữ liệu của bạn để tìm một số việc phải làm" được gửi tới tất cả các máy khách.

Tôi nghĩ rằng một số loại hàng đợi xuất bản/đăng ký tin nhắn sẽ được áp dụng cho công việc, nhưng tôi không muốn có thêm bất kỳ sự phức tạp nào.

Có phần mềm cấu hình/bảo trì bằng 0 hoặc gần bằng 0 để đạt được điều này không? Các tùy chọn là gì?

X

+0

Những hệ thống cơ sở dữ liệu bạn đang sử dụng? SQL server? –

+0

Đó là cơ sở dữ liệu MySQL. –

+3

arr ok. Với Sql server 2005 bạn có Sql server message broker. Nó cho phép các quá trình khách hàng của bạn chặn và tiêu thụ 0% cpu cho đến khi có việc phải làm (một thông báo trong q). Mỗi tin nhắn là giao dịch. Tuy nhiên, ofc, bạn không cần máy chủ SQl để thực hiện loại xử lý này. Tuy nhiên, tôi không thể đề xuất một cách khác, vì tôi chưa sử dụng chúng, p –

Trả lời

3

Có một số không hoặc gần bằng không cấu hình/bảo trì phần của phần mềm đó sẽ đạt được điều này? Các tùy chọn là gì?

Có thể, nhưng những gì bạn sẽ lưu trong cấu hình và thời gian thực hiện có thể sẽ làm tổn thương hiệu suất nhiều hơn dịch vụ bỏ phiếu của bạn. SQL Server không được thực hiện để thực hiện một cú đẩy thực sự (không dễ dàng anyway). Có những thứ bạn có thể sử dụng để đẩy dữ liệu ra (dịch vụ nhân bản, vận chuyển nhật ký - công cụ icky), nhưng chúng phức tạp hơn và yêu cầu nhiều tài nguyên hơn dịch vụ bỏ phiếu đơn giản của bạn. Một số tùy chọn sẽ là:

  1. một số loại cò chạy thực thi bằng cách sử dụng dòng lệnh gọi (sp_cmdshell)

  2. sử dụng một đối tượng COM mà SQL Server có thể mở và chạy

  3. sử dụng một tác nhân SQL Agent để chạy một VBScript (mà một lần nữa sẽ được coi là "bỏ phiếu")

Các tùy chọn này là một chút vô lý xem xét wh tại bạn đã làm được đơn giản hơn nhiều.

Nếu bạn lo lắng về dịch vụ bỏ phiếu bằng cách sử dụng quá nhiều chu kỳ hoặc thứ gì đó - bạn luôn có thể điều chỉnh lại - bỏ phiếu mỗi phút, cứ 10 phút hoặc thậm chí chỉ một lần mỗi ngày có thể phù hợp hơn - đây sẽ là doanh nghiệp quyết định, vì vậy hãy hỏi ai đó trong doanh nghiệp về tốc độ cần thiết.

Dịch vụ bỏ phiếu đơn giản khá phổ biến, bởi vì chúng, cũng ... đơn giản. Ngoài ra, chúng cũng có chi phí thấp, ổn định từ xa và khả năng chịu lỗi. Mặt trái là họ có thể đập cơ sở dữ liệu vào bụi nếu không được kiểm soát cẩn thận.

3

Hàng đợi thư có thể hoạt động tốt vì chúng thường được thiết lập để có thể chặn trong một thời gian mà không lãng phí tài nguyên. Nhưng với MySQL, tôi không nghĩ đó là một lựa chọn.

Nếu bạn chỉ muốn giảm tải trên DB, bạn có thể tạo một bảng với một hàng duy nhất: ID công việc mới nhất. Sau đó, khách hàng chỉ cần so sánh với ID cuối cùng của họ để xem họ có cần chạy toàn bộ cuộc thăm dò đối với bảng thực không. Bằng cách này, chi phí sẽ giảm đáng kể, nếu đây là vấn đề.

+1

Việc bỏ phiếu của bạn chỉ có thể sử dụng 'SHOW TABLE STATUS' để phát hiện khi bảng được cập nhật lần cuối và tránh tạo bảng mới. –

5

Có bằng chứng khách quan nào cho thấy bất kỳ tải trọng đáng kể nào đang được đặt trên máy chủ không? Nếu nó hoạt động, tôi chắc chắn rằng có một vấn đề cần giải quyết ở đây.

Nó phải là tốt đẹp để có tất cả mọi thứ chạy trơn tru mà bạn đang nhìn vào những thứ mà chỉ có thể được cải thiện!

+0

Cách tốt để đặt nó. Upvote trên đó :) – Jasmine

1

Không giống như Postgres và SQL Server (hoặc đối tượng lưu trữ như CouchDb), MySQL không phát ra các sự kiện cơ sở dữ liệu. Tuy nhiên có một số mẫu mã hóa bạn có thể sử dụng để mô phỏng điều này.

Nếu bạn có một hoặc nhiều bảng mà bạn muốn theo dõi, bạn có thể tạo trình kích hoạt trên các bảng này thêm hàng vào bảng "thay đổi" ghi lại hàng đợi sự kiện cần xử lý. Trình kích hoạt của bạn lọc tập hợp con các thay đổi dữ liệu mà bạn quan tâm và tạo bản ghi trong bảng thay đổi của bạn cho từng sự kiện bạn muốn thực hiện. Bởi vì mẫu này hàng đợivẫn còn sự kiện hoạt động tốt ngay cả khi công nhân xử lý các sự kiện này bị gián đoạn.

Bạn có thể nghĩ rằng MyISAM là lựa chọn tốt nhất cho bảng thay đổi vì nó chủ yếu thực hiện ghi (hoặc thậm chí MEMORY nếu bạn không cần phải duy trì sự kiện giữa cúp máy chủ cơ sở dữ liệu). Tuy nhiên, hãy nhớ rằng cả bộ nhớ và bộ nhớ và MyISAM chỉ có các khóa toàn bảng để kích hoạt của bạn trên một bảng InnoDB có thể chạm vào cổ chai khi thực hiện chèn vào bảng MEMORY và MyISAM. Bạn cũng có thể yêu cầu InnoDB cho bảng thay đổi nếu bạn đang sử dụng một DELETE CASCADE ON với một bảng InnoDB khác (yêu cầu cả hai bảng sử dụng cùng một công cụ).

Bạn cũng có thể sử dụng SHOW TABLE STATUS để kiểm tra thời gian cập nhật cuối cùng của bảng thay đổi để kiểm tra xem có điều gì đó cần thực hiện hay không. Tính năng này wont work cho các bảng InnoDB.

Các bài viết này mô tả chi tiết hơn một số cách thay thế để triển khai hàng đợi trong MySQL và thậm chí tránh bỏ phiếu!

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