2013-03-15 36 views
6

Tôi hiện đang sử dụng mysqldb cho cơ sở dữ liệu của mình và tôi cần tích hợp tính năng nhắn tin trong thời gian thực. Các chat demo rằng Tornado cung cấp không thực hiện một cơ sở dữ liệu, (trong khi blogkhông.)Làm cách nào để lưu trữ các tin nhắn trò chuyện trong thời gian thực trong cơ sở dữ liệu?

dịch vụ nhắn tin này cũng cũng sẽ tăng gấp đôi như một email trong tương lai (như cách làm việc của dịch vụ tin nhắn của Facebook. Nền tảng trò chuyện cũng là email.) Bất kể, tôi muốn đảm bảo rằng phiên bản trò chuyện đầu tiên hiện tại của tôi sẽ có thể được mở rộng để hoạt động như email và tổng thể, tôi cần lưu trữ thư trong cơ sở dữ liệu.

Có điều gì đó đơn giản như: đối với mỗi tin nhắn trò chuyện được gửi, truy vấn cơ sở dữ liệu và hiển thị thông báo trên màn hình của người dùng. Hoặc, phương pháp này có dễ bị tải máy chủ cao và tối ưu hóa kém không? Làm thế nào chính xác tôi nên cấu trúc "cơ sở hạ tầng" để thực hiện công việc này?

(Tôi xin lỗi vì một số các tính chủ quan vốn có trong câu hỏi này, tuy nhiên, tôi thích để "đo hai lần, mã một lần.")

Input, ví dụ, và các nguồn lực đánh giá cao.
Trân trọng.

Trả lời

12

Tornado là một máy chủ không chặn luồng duy nhất.

Điều này có nghĩa là nếu bạn thực hiện bất kỳ cuộc gọi chặn nào trên luồng chính, cuối cùng bạn sẽ hủy hiệu suất. Bạn có thể không nhận thấy điều này lúc đầu bởi vì mỗi cuộc gọi cơ sở dữ liệu có thể chỉ chặn trong 20ms. Nhưng một khi bạn đang thực hiện hơn 200 cuộc gọi cơ sở dữ liệu mỗi giây, ứng dụng của bạn sẽ bị khóa một cách hiệu quả.

Tuy nhiên, đó là một vài cuộc gọi DB. Trong trường hợp của bạn, 200 người sẽ gửi tin nhắn trò chuyện của họ trong cùng một giây.

Điều bạn có thể muốn làm là sử dụng hàng đợi có API không chặn. Vì vậy, Tornado nhận được một tin nhắn trò chuyện. Bạn đặt nó vào hàng đợi để được lưu vào cơ sở dữ liệu bằng một tiến trình khác, sau đó bạn gửi tin nhắn trò chuyện trở lại các thành viên trò chuyện khác.

Khi ai đó kết nối với phiên trò chuyện, bạn cũng cần phải gửi yêu cầu tới hàng đợi cho tất cả các tin nhắn trước đó, khi hàng đợi phản hồi bạn gửi cho người dùng mới được kết nối.

Đó là cách tôi sẽ tiếp cận vấn đề.

Cũng thấy câu hỏi này và trả lời: Any suggestion for using non-blocking MySQL api on Tornado in Python3?

Chỉ cần nhớ, Tornado là đơn ren. Ngạc nhiên. Và có thể xử lý hàng ngàn kết nối đồng thời. Nhưng nếu mã trong một trong các kết nối đó bị chặn trong 1 giây thì NOTHING khác sẽ được thực hiện cho bất kỳ kết nối nào khác trong giây lát đó.

+0

Wow đây là một câu trả lời tuyệt vời, cảm ơn sự giúp đỡ của bạn về điều này. Điều này làm cho cảm giác hoàn hảo và là một nơi tuyệt vời để bắt đầu. – JohnZ

+3

Bạn có thể nói rằng tôi đã sử dụng các cuộc gọi chặn trên vòng lặp Tornado trong một ứng dụng sản xuất trước đây? :) – aychedee

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