16

Tôi đang trong quá trình xây dựng một API dịch vụ web cho ứng dụng của mình. Ngoài ra, tôi đang lên kế hoạch vạch trần Dịch vụ qua cả REST và SOAP.Tôi nên chọn ngôn ngữ lập trình nào cho dịch vụ web hiệu suất cao của mình?

Tôi quan tâm đến việc nhận được một số phản hồi từ cộng đồng về ngôn ngữ lập trình mà tôi nên chọn để triển khai dịch vụ? (Tôi biết C#, Java và Ruby - RoR cũng đủ để tạo dịch vụ).

Dịch vụ chủ yếu là dịch vụ HTTP POST. Nó sẽ cần xử lý khoảng 2000 kết nối đồng thời cũng như có thể xử lý khoảng 10.000 HTTP POST mỗi giây. (đối với SOAP, chúng tôi sẽ có phương thức gửi để khách hàng gọi).

Dịch vụ không trả lại bất kỳ phản hồi nào cho khách hàng về các yêu cầu POST.

Bất kỳ ý tưởng nào về ngôn ngữ/kiến ​​trúc lập trình nào nên được sử dụng?

+0

Nó không gửi bất kỳ phản hồi nào cả? Thậm chí không phải là một HTTP 200? –

+3

ít nhất bạn nên phản hồi: HTTP/1.0 204 Không có phản hồi – Jacco

+0

Nếu bạn tự hỏi liệu đây có thực sự là một số lượng kết nối và yêu cầu hợp lý không, hãy nghĩ Mạng cảm biến hoặc API cho ứng dụng di động. –

Trả lời

46

10.000 yêu cầu mỗi giây là 25 tỷ lượt truy cập mỗi tháng. Điều đó có nghĩa là một trong hai điều sau:

  1. Ứng dụng của bạn phổ biến hơn MySpace; hoặc
  2. Bạn đang cố gắng sử dụng điều này để liên lạc giữa hai thành phần trò chuyện rất rất mà bạn kiểm soát và đó là nghèo lựa chọn thiết kế khủng khiếp.

Phần cứng chuyển đổi một mình để phân phối nhiều tải trên một trang trại đầu cuối web sẽ tốn nhiều nghìn đô la.

Bắt đầu bằng cách viết một dịch vụ web có thể xử lý 50 yêu cầu mỗi giây (lựa chọn ngôn ngữ không có liên quan quá nhiều). Nếu đơn đăng ký của bạn quá bận rộn đến mức bạn vượt qua ngưỡng đó thường xuyên, bạn có thể đủ khả năng thuê người nào đó để giải quyết vấn đề mở rộng quy mô toàn thời gian và không phải yêu cầu trợ giúp trên trang web miễn phí Q &.

+13

Jon Skeet có thể. –

+23

Chuck norris không nhận yêu cầu; anh ta ra lệnh. –

+2

Chuck Norris không nhận yêu cầu; anh ta tách chúng khỏi bạn. –

2

Bạn thực sự có thể sử dụng bất kỳ ngôn ngữ nào thông qua CGI (Giao diện cổng chung), do đó nó sẽ hoạt động. Trong số các ngôn ngữ bạn liệt kê, tôi mong C# là nhanh nhất. So sánh tốt về tốc độ giữa các ngôn ngữ là The Language Shootout

Nếu bạn thực sự cần hiệu suất bạn có thể muốn xem theo hướng ngôn ngữ có hiệu suất cao hơn như C hoặc D để xử lý yêu cầu.

Tất cả phụ thuộc vào loại tính toán mà mỗi yêu cầu phải thực hiện thực sự.

+0

CGI là một sự lựa chọn rất nghèo vì nó cho biết thêm chi phí sinh sản quá trình (có thể rất cao) để xử lý thực tế. Gần đây tôi đã chiến đấu để chuyển một kiến ​​trúc CGI thành một bộ nhớ. Nguyên mẫu ban đầu cho thấy tăng hiệu suất 10-100x! –

+2

tốt, bạn đang lãng phí thời gian của bạn, hãy xem FastCGI (đó là một trong những gì tôi refor khi chỉ đơn giản là nói 'CGI'). FastCGI được thiết kế với ý định rằng ứng dụng CGI của bạn không bao giờ hồi sinh nhưng vẫn ở trong bộ nhớ không xác định. Vì vậy, không có, sẽ không có chi phí trên sinh sản một quá trình. ;-) – Zuu

13

Với 10.000 bài đăng mỗi giây, ngôn ngữ là ít nhất bạn phải lo lắng. Một vấn đề lớn hơn nhiều sẽ là thiết kế trang trại và mạng máy chủ của bạn. Tôi giả sử bạn không có kế hoạch chạy trên một hộp duy nhất?

0

Cập nhật: Nó có nghĩa là một đám cháy và quên dịch vụ web. Tôi đoán tôi sẽ gửi lại phản hồi HTTP 200/OK đơn giản

Không có điều này không có ý định chạy trên một hộp duy nhất. Nó dự định chạy trên một vài hộp (nói 3-4).

Khi nhận được yêu cầu, chúng được đẩy vào hàng đợi trên các máy khác, sau đó chúng được lấy và đưa vào một Cửa hàng HBase/Voldemort.

Như tôi đã nói, có nghĩa là nó là một "ngọn lửa và quên đi" dịch vụ web

+2

Bạn nên chỉnh sửa câu hỏi của mình để bao gồm câu hỏi này làm rõ hoặc nhận xét trực tiếp về câu trả lời. Đây không phải là một bảng tin. –

+0

Không có cách nào bạn có thể xử lý nhiều yêu cầu/giây với 3-4 máy. Chúc may mắn! –

+0

"3-4 hộp" vẫn còn 2500-3300 yêu cầu mỗi giây trên một máy. Đó chỉ là không thực tế. –

11

ứng dụng cao khả năng mở rộng, đáng tin cậy, phân phối và sử dụng các hệ thống đa lõi/đa? Ở đây tôi ngay lập tức nghĩ về Erlang/OTP cùng với Yaws là máy chủ ứng dụng web. Yaws chạy cực ổn định và nhanh chóng dưới tải cực cao. Và Erlang/OTP là nền tảng được thiết kế để đồng thời và phân phối, cùng với một số cơ chế giúp phát triển phần mềm ổn định. Chi phí: định hướng đồng thời với ngôn ngữ lập trình hàm không có OOP với Java hoặc C#, cú pháp có vẻ lạ (nhưng rất thẳng và mạnh mẽ khi bạn đã chấp nhận nó), và số lượng thư viện của bên thứ ba không lớn đối với các ngôn ngữ chính thống. Nhưng nó đáng giá.

Hope this helps

mue

5

Với tốc độ đó, và vì bạn đang phá vỡ HTTP anyway (không trả lời), bạn cũng có thể phát triển máy chủ của riêng bạn, hoặc sửa đổi một máy chủ mã nguồn mở.

Viết tất cả trong C hoặc C++ và bạn sẽ cảm thấy hào nhoáng càng nhanh càng tốt.

Khả năng mở rộng bị ảnh hưởng bởi nhiều lựa chọn ngôn ngữ hơn.

-Adam

0

Bạn cần một C llike ngôn ngữ và để tránh phải viết một máy chủ hoàn thành tôi sẽ đề nghị CGI (đó là những gì php và giống như tất cả chạy qua anyway) máy chủ Windows cung cấp plug-in ISAPI, nhưng những chạy trong bối cảnh của máy chủ để rò rỉ bộ nhớ và GPFs sẽ lấy xuống máy chủ. Thêm vào đó sự bất tiện khi dừng/khởi động máy chủ mỗi khi bạn thay đổi mọi thứ, CGI/FastCGI trông đẹp hơn.

4

Tôi có thể thấy nhận được một tỷ bài đăng mỗi tháng từ một máy. Tôi có một dịch vụ web được viết bằng C# hiện đang xử lý khoảng 3,5 triệu bài đăng mỗi ngày. Máy chủ web đang chạy cùng với mức sử dụng CPU 3%. Điều đó có nghĩa là tôi có thể đẩy nó ít nhất là 20 lần ...

Giả sử mỗi máy của bạn có 4 lõi Xeon Sáu, 32GB RAM, mảng đĩa nhanh và cơ sở dữ liệu được tối ưu hóa cao để ghi bạn có thể làm điều đó . Mặc dù, chi phí của mỗi máy chủ có thể nằm trong khoảng từ $ 35K đến $ 40K.

Bất kể, nút cổ chai của bạn sẽ không được với C# hoặc Java. Nó sẽ được với máy chủ cơ sở dữ liệu tùy thuộc vào mức độ phát triển của nó. Trong trường hợp của tôi, khoảng 300GB với 10GB bị xóa và 10GB được thêm mỗi ngày.

22

Dựa trên kinh nghiệm trước đây của tôi, tôi có thể cung cấp cho bạn lời khuyên sau.

  1. Chọn ngôn ngữ bạn (và các thành viên khác trong nhóm) thích nhất. Tôi thích các ngôn ngữ cấp cao hơn vì phần cứng nhanh và rẻ, nhưng các lập trình viên chậm và tốn kém.
  2. Thiết kế dịch vụ của bạn tới hoàn toàn không có trạng thái (không có phiên nào!). Điều này làm cho nó dễ dàng để thêm phần cứng mới, như các trường hợp khác nhau của dịch vụ của bạn không cần biết lẫn nhau.
  3. Xử lý quá trình xử lý của bạn một cách không đồng bộ, vì bạn may mắn không cần cung cấp cho khách hàng bất kỳ phản hồi nào (ngoài OK). Nếu bạn làm điều đó một cách đồng bộ, quá trình của bạn sẽ chặn và tỷ lệ yêu cầu của bạn sẽ giảm. Một đọc tốt là this Wikipedia article, và đặc biệt là (cổ điển!) The C10K problem.
  4. Đặt dịch vụ trên nhiều máy. (tùy thuộc vào tốc độ dịch vụ của bạn)
  5. Đặt (các) máy chủ cơ sở dữ liệu của bạn trên các máy khác ngoài dịch vụ web. Sử dụng đĩa nhanh!
  6. Xử lý tải bằng cách cân bằng nó với một cái gì đó như:
    • Linux Virtual Server, giải pháp performant nhất, bởi vì nó chạy trong Kernel. Vảy như điên. Tôi đã sử dụng nó năm 2003 với ~ 500req/giây trên P3/1GHz với tải CPU 0,1%. Có thể được ghép nối để đạt được HA. Nên xử lý 10000req/giây khá độc đáo trên một máy tính duy nhất. Làm điều này sau khi thử một cái gì đó đơn giản hơn. Điều này có thể khá khó khăn.
    • Pound, rất dễ thiết lập nhưng chi phí cao. Điểm khởi đầu tốt. Có thể thực hiện SSL.
    • Nginx, cấu hình dễ dàng, rất hiệu quả. Có thể thực hiện SSL. Cũng có thể hoạt động như HTTP-Server và có thể là giải pháp lưu trữ hiệu suất cho các dịch vụ của bạn.
    • Perlbal, chưa sử dụng nhưng nghe những điều tốt đẹp.
    • hoặc khác reverse proxys.
3

Cho phép xem xét các vấn đề:

IO: điều này sẽ dễ dàng trở thành nút cổ chai lớn nhất trong hệ thống của bạn. Chọn một ngôn ngữ cung cấp tích hợp tốt nhất với hệ điều hành máy chủ, và cung cấp ngữ nghĩa nâng cao cho việc không chặn và tùy chọn hỗ trợ cho đồng thời.

Dữ liệu: SOAP? XML? Bạn sẽ muốn giảm thiểu mọi chu kỳ CPU không cần thiết. Có gì sai khi sử dụng JSon? (Và không có lệnh chính tả nào nói rằng một máy chủ dựa trên kiến ​​trúc REST không thể sử dụng dữ liệu nhị phân trong giao thức ...)

Nội dung: Nếu có chuyển đổi dữ liệu (từ văn bản sang số) , bạn cũng sẽ cần phải xem xét ngôn ngữ nào cung cấp các cơ chế hiệu quả nhất. Ví dụ, trong Java (mà là một ứng cử viên rất mạnh mẽ cho bạn, btw) lớp String là một hog CPU nghiêm trọng.

Java và Erlang là những ứng viên rất giỏi. C luôn là một lựa chọn nhưng lập trình đồng thời khó hơn nhiều.