Giả sử bạn đang viết một daemon phục vụ một hàng đợi công việc. Nhiều phần mềm khác ghi công việc cho daemon vào hàng đợi. Daemon sẽ thăm dò hàng đợi vài giây một lần cho các công việc đang chờ xử lý. Giả sử hàng đợi được thực hiện như một bảng trong một cơ sở dữ liệu MySQL và daemon là một vòng lặp đơn giản:Làm thế nào để thiết kế một daemon với một kết nối MySQL DB
- nhận được tất cả các công việc do từ hàng đợi
- làm các công việc
- ngủ cho N giây
- goto 1
Daemon phải tồn tại dịch vụ bị gián đoạn từ máy chủ MySQL DB và gián đoạn kết nối DB.
Bạn có thiết kế daemon để kết nối với máy chủ DB một lần trên mỗi chu kỳ không? tức là kết nối trước 1. và ngắt kết nối giữa 2 và 3?
Hoặc bạn sẽ có daemon giữ kết nối mở? Trong trường hợp nó cũng cần đến a) phát hiện khi máy chủ hoặc kết nối không hoạt động, b) ngắt kết nối và kết nối lại, và c) làm như vậy mà không tích lũy kết nối DB, mô tả kết nối dud hoặc các tài nguyên chết khác.
Nếu bạn có sở thích, tại sao?
Ưu và nhược điểm?
Các yếu tố tham gia vào thiết kế?
Bất kỳ phương pháp tiếp cận nào khác?
Câu trả lời ở đây: mysql connection from daemon written in php không cho biết lý do tại sao nên giữ kết nối luôn tốt hơn. Tôi đọc ở đâu đó rằng chi phí cho mỗi kết nối trong MySQL rất nhẹ. Vì vậy, nó không phải là rõ ràng lý do tại sao tiêu thụ vĩnh viễn một kết nối máy chủ là tốt hơn so với kết nối/ngắt kết nối mỗi vài giây.
Trong trường hợp của tôi, daemon được viết bằng PHP.
Bạn đang cố gắng làm gì? Tùy thuộc vào từng trường hợp, âm thanh như một tệp FIFO hoặc ổ cắm có thể tốt hơn để kích hoạt daemon ... (Và những gì tôi sẽ làm là tạo lại kết nối mỗi khoảng thời gian thăm dò, nhưng sau đó một lần nữa tôi sẽ không bỏ phiếu sau mỗi vài giây) ... – ircmaxell
@ircmaxell: FIFO không thuận tiện trong trường hợp của tôi bởi vì các quá trình đặt công việc trong hàng đợi cần có khả năng đọc nó và vì trạng thái xếp hàng công việc cần phải tồn tại khi khởi động lại máy chủ. MySQL nhân rộng của hàng đợi cũng là tiện dụng. –
Tôi không có ý định chuyển tất cả dữ liệu qua FIFO. Chỉ cần kích hoạt daemon để đọc từ hàng đợi dựa trên mysql. Vì vậy, về cơ bản bạn sẽ 'INSERT INTO hàng đợi VALUES (công việc)', sau đó 'file_put_contents ('fifo.file', '1');'. Daemon sẽ ngủ cố gắng mở nămo. Vì vậy, nếu nó được thực hiện xử lý tất cả về cơ bản nó sẽ chặn trên 'fopen ('fifo.file', 'r');'. Lần sau một quá trình thêm vào hàng đợi, nó chỉ thông báo cho daemon, sau đó ngay lập tức bắt đầu xử lý công việc. Nhưng trong khi nó đang ngủ nó không tiêu thụ bất kỳ tài nguyên vì nó là một cuộc gọi hệ thống đó là chặn (ngay cả đối với giờ tại một thời điểm). – ircmaxell