2010-08-22 31 views
11

Máy chủ phân tích của chúng tôi được viết bằng C++. Về cơ bản nó truy vấn công cụ lưu trữ cơ bản và trả về một dữ liệu có cấu trúc khá lớn thông qua tiết kiệm. Một yêu cầu điển hình sẽ mất khoảng 0,05 đến 0,6 giây để hoàn thành phụ thuộc vào kích thước yêu cầu.TNonblockingServer, TThreadedServer và TThreadPoolServer, cái nào phù hợp nhất với trường hợp của tôi?

Tôi nhận thấy rằng có một vài tùy chọn về máy chủ tiết kiệm mà chúng tôi có thể sử dụng trong mã C++, cụ thể là TNonblockingServer, TThreadedServer và TThreadPoolServer. Có vẻ như TNonblockingServer là con đường để đi vì nó có thể hỗ trợ nhiều yêu cầu đồng thời hơn và vẫn sử dụng một hồ bơi thread đằng sau hiện trường để crunch thông qua các nhiệm vụ. Nó cũng tránh được chi phí xây dựng/hủy các luồng.

cập nhật của Facebook trên hành tiết kiệm: http://www.facebook.com/note.php?note_id=16787213919

Tại Facebook, chúng tôi đang làm việc trên một khách hàng hoàn toàn không đồng bộ và máy chủ cho C++. Máy chủ này sử dụng I/O theo hướng sự kiện như TNonblockingServer hiện tại, nhưng giao diện của nó là mã ứng dụng là tất cả dựa trên các cuộc gọi lại không đồng bộ. Điều này sẽ cho phép chúng tôi viết các máy chủ có thể phục vụ hàng nghìn yêu cầu đồng thời (mỗi yêu cầu yêu cầu thực hiện cuộc gọi đến các máy chủ Tiết kiệm hoặc Memcache khác) chỉ với một vài chủ đề.

bài viết liên quan trên stackover: Large number of simulteneous connections in thrift

Nói như vậy, bạn sẽ không nhất thiết phải có khả năng để thực sự làm việc nhanh hơn (xử lý vẫn thực hiện trong một hồ bơi thread), nhưng nhiều khách hàng sẽ được có thể kết nối với bạn cùng một lúc.

Chỉ cần tự hỏi có bất kỳ yếu tố nào khác mà tôi bị thiếu ở đây không? Làm thế nào tôi sẽ quyết định cái nào phù hợp với nhu cầu của tôi nhất?

Trả lời

5

Yêu cầu mất 50-600 mili giây để hoàn thành là khá dài. Thời gian cần thiết để tạo hoặc phá hủy một chuỗi nhỏ hơn rất nhiều so với điều đó, vì vậy đừng để yếu tố đó vào quyết định của bạn vào lúc này. Tôi sẽ chọn một trong đó là dễ nhất để hỗ trợ và đó là ít nhất là dễ bị lỗi. Bạn muốn giảm thiểu khả năng xảy ra lỗi đồng thời tinh tế. Đây là lý do tại sao nó thường dễ dàng hơn để viết mã xử lý giao dịch đơn luồng chặn nơi nó cần, và có nhiều trong số này chạy song song, hơn là có một mô hình không chặn phức tạp hơn. Một luồng bị chặn có thể làm chậm một giao dịch riêng lẻ, nhưng nó không ngăn máy chủ thực hiện công việc khác trong khi nó chờ đợi.

Nếu tải giao dịch của bạn tăng (tức là nhiều giao dịch khách hàng hơn) hoặc yêu cầu trở nên nhanh hơn để xử lý (tiếp cận 1 mili giây cho mỗi giao dịch), thì chi phí giao dịch trở nên lớn hơn. Số liệu cần chú ý là thông lượng: số lượng giao dịch hoàn thành trên mỗi đơn vị thời gian. Thời lượng tuyệt đối của một giao dịch đơn lẻ ít quan trọng hơn tốc độ mà chúng đang được hoàn thành, ít nhất là nếu nó vẫn dưới một giây.

4

Một chàng trai trên Github đã làm một so sánh thoải mái

TThreadedServer

TThreadedServer spawns một chủ đề mới cho mỗi kết nối khách hàng, và mỗi chủ đề vẫn còn sống đến khi kết nối khách hàng được đóng lại.Điều này có nghĩa rằng nếu có 1000 kết nối máy khách đồng thời, thì TThreadedServer cần chạy 1000 luồng cùng một lúc.

TNonblockingServer

TNonblockingServer có một thread dành riêng cho mạng I/O. Cùng một luồng cũng có thể xử lý các yêu cầu hoặc bạn có thể tạo một nhóm công việc riêng biệt để xử lý yêu cầu. Máy chủ có thể xử lý nhiều kết nối đồng thời với một số lượng nhỏ các chủ đề vì nó không cần phải sinh ra một chuỗi mới cho mỗi kết nối.

TThreadPoolServer (không benchmarked đây)

TThreadPoolServer cũng tương tự như TThreadedServer; mỗi kết nối máy khách nhận được luồng máy chủ chuyên dụng của riêng nó. Nó khác với TThreadedServer theo 2 cách:

Chuỗi máy chủ quay trở lại nhóm chủ đề sau khi khách hàng đóng kết nối để sử dụng lại. Có giới hạn về số lượng chủ đề. Hồ bơi chủ đề sẽ không vượt quá giới hạn. Khách hàng bị treo nếu không còn chủ đề nào khác trong nhóm chủ đề. Sẽ khó sử dụng hơn so với 2 máy chủ khác.

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