2009-09-14 46 views
8

Tôi đang xây dựng một webservice sắp bị tải vô lý (hàng nghìn đến mười nghìn truy vấn mỗi giây). Bình thường của tôi apache, PHP, memcache và một số DB sẽ có thể xử lý nó với một infront load balancer tốt đẹp và rất nhiều máy móc, nhưng tôi tự hỏi nếu có giải pháp tốt hơn.Ngăn xếp công nghệ có khả năng mở rộng cao

Điểm cuối sẽ bị nhấn bởi đèn hiệu (thông qua javascript trên máy khách), tôi sẽ đọc cookie của người dùng, kéo một số thông tin nhỏ từ DB, lưu vào bộ nhớ cache, thực hiện một số phép tính nhỏ, gửi phản hồi và nếu cần ghi vào DB và làm mất hiệu lực bộ nhớ cache.

Và các lựa chọn công nghệ và/hoặc đề xuất phần cứng tốt?

Trả lời

13

Đây không phải là loại câu hỏi có thể được trả lời ở đây trong bất kỳ điều gì khác ngoài tổng quan rộng. Một số gợi ý chung:

  • Phần cứng: hai lựa chọn là về cơ bản rất nhiều, hộp giá rẻ nhỏ hoặc số ít các hộp mạnh hơn. Các hộp rẻ hơn, tốt hơn, rẻ hơn nhưng thường tiêu thụ nhiều năng lượng hơn cho cùng một CPU hoặc bộ nhớ (tùy theo điều gì quan trọng đối với bạn) so với các hộp lớn hơn. Mọi người thường quên đi chi phí tiêu thụ điện năng đôi khi đáng kể;
  • Phụ trợ: bạn có một vài lựa chọn từ đầu lớn của thành phố (Oracle, SQL Server) đến đầu hàng được kết xuất (MySQL). MySQL rõ ràng là rẻ hơn và bạn có thể đi xa trên MySQL nhưng không có câu hỏi rằng Oracle (mà tôi quen thuộc hơn với SQL Server) có một trình tối ưu hóa tốt hơn, có nhiều khả năng hơn và mạnh hơn MySQL. Tuy nhiên, bạn sẽ trả tiền cho nó;
  • Ngân sách: đây là một yếu tố rất lớn vì nó có thể đáng để trả tiền cho phần mềm thương mại tốt hơn là trả chi phí phát triển để sử dụng phần mềm "miễn phí". Phát triển phần mềm là một trong những chi phí đắt nhất của tất cả;
  • Khả năng mở rộng theo chiều dọc và ngang: câu hỏi mà bạn đang tìm cách trả lời ở đây là xây dựng (hộp lớn hơn, vv) hoặc xây dựng (môi trường nhóm). Các giải pháp có khả năng mở rộng nhất có khả năng mở rộng ngang tuyến tính nhưng trong khả năng mở rộng theo chiều dọc ngắn hơn có thể rẻ hơn.

Đối với ngăn xếp thông thường của bạn, tôi sẽ liên kết với nó trừ khi bạn có yêu cầu cụ thể mà bạn chưa đề cập đến là cấm nó. Sau khi tất cả PHP là một công nghệ đã được chứng minh chạy 4 hoặc hơn 20 trang web hàng đầu trên Internet (Facebook, Wikipedia, Flickr và tôi nghĩ rằng Yahoo). Nếu nó đủ tốt cho họ, nó đủ tốt cho bạn.

Quan trọng hơn, bạn biết điều đó. Ngăn xếp công nghệ bạn biết ngăn xếp công nghệ trump bạn không ở trong mọi trường hợp. Hãy coi chừng cái bẫy "đồng cỏ xanh" của ngăn xếp công nghệ mới nhất.

Memcache là tốt. Một thứ khác mà bạn có thể muốn xem xét thêm vào mix là beanstalkd như một bộ xử lý hàng đợi công việc phân tán.

Một câu hỏi quan trọng cần trả lời là: bạn có thể phân vùng ứng dụng của mình tốt đến mức nào? Các ứng dụng dễ dàng tự cho phép phân vùng dễ dàng hơn nhiều. Những người không có xu hướng được sửa đổi một cách nào đó để làm cho họ dễ dàng hơn để phân vùng.

Một ví dụ điển hình về việc này là một ứng dụng chia sẻ đơn giản.Bạn có thể phân vùng thông tin thị trường dựa trên mã chứng khoán (A-C trên một máy chủ, D-F trên một máy chủ khác và vv). Đối với nhiều ứng dụng như vậy sẽ hoạt động tốt.

5

http://highscalability.com/ có rất nhiều điều cần tìm hiểu tại đây, bạn sẽ tìm thấy câu trả lời của mình một cách nguy hiểm.

+1

Mục tiêu của tôi không phải là một hệ thống có khả năng mở rộng lớn, chỉ là một ngăn xếp công nghệ đơn giản. Tìm kiếm, trình thu thập thông tin, v.v. Chỉ cần một yêu cầu đơn giản, truy vấn, phản hồi và lưu trữ. Bất kỳ đề xuất nào về ngăn xếp công nghệ cho mục đích của tôi là –

+0

Từ những gì tôi đã thấy, bạn có thể xây dựng hệ thống có thể mở rộng với bất kỳ ngăn xếp công nghệ nào. hàng nghìn truy vấn mỗi giây "thực sự cao, vì vậy đối với tôi đó là" hệ thống có khả năng mở rộng lớn ".Bất kỳ ngăn xếp công nghệ nào có câu chuyện thành công của họ. Nếu bạn muốn hỗ trợ khoản phí này, bạn cần phải đọc trang web này (và có thể xem xét sử dụng lưu trữ khóa/giá trị dưới dạng CouchDB thay vì một cơ sở dữ liệu quan hệ) –

0

Tôi có thể đóng góp một thành phần tốt cho ngăn xếp của bạn: MemCache.

0

PHP, memcached + DB nói chung có quy mô tốt nhưng có thể có cách để làm điều đó với chi phí thấp hơn, tức là ngăn xếp có thể xử lý nhiều yêu cầu đồng thời hơn cho mỗi máy.

Với nhận xét của bạn ở đây ...

Mục tiêu của tôi không phải là một hệ thống mở rộng lớn, chỉ cần một công nghệ ngăn xếp đơn giản. Tôi không phát triển một DB, Tìm kiếm, trình thu thập thông tin, v.v ... Chỉ cần một yêu cầu, truy vấn, phản hồi và lưu trữ đơn giản. Bất kỳ đề xuất nào cho ngăn xếp công nghệ cho mục đích của tôi?

.. có vẻ như phần DB có thể được giải quyết bằng S3 của Amazon ([what?!?] [1]), giả sử bạn chỉ cần định vị các mục theo khóa. Điều đó cũng sẽ cung cấp cho bạn Cloudfront để đọc, nếu bạn không quan tâm đến số eventual consistency.

Trong khi đó phía máy chủ, sử dụng async IO để xử lý yêu cầu sẽ tăng đáng kể số lượng yêu cầu đồng thời mà mỗi máy có thể xử lý. Như một áp phích khác đã nói lốc xoáy (bret.appspot.com/entry/tornado-web-server) sẽ đáng để xem xét ở đây - chưa thấy một API cho async IO thân thiện hơn. Bạn có lẽ vẫn cần memcached để giữ cho đọc nhanh nhưng bạn muốn xem ra rằng khách hàng memcached sẽ không kết thúc chặn quá trình máy chủ trong khi cố gắng để thực hiện yêu cầu đồng thời - PHP thường sẽ không có vấn đề này là mỗi quá trình PHP (hoặc Apache) có kết nối memcached riêng của nó và chỉ từng làm một việc tại một thời điểm. This python client - phải hỗ trợ IO không đồng bộ - libmemcached cơ bản có hỗ trợ cho các yêu cầu không đồng bộ.

Tương tự đối với các yêu cầu HTTP từ máy chủ đến S3 - cách bạn xử lý các yêu cầu đồng thời ở đó? boto dường như sử dụng một hồ bơi kết nối cho điều đó, mỗi kết nối giữ một ổ cắm khác nhau mở. Sử dụng bộ nhớ?

Tuyên bố miễn trừ trách nhiệm: Tôi là một kiến ​​trúc sư ghế bành ở đây - chưa thực sự làm điều này và lời khuyên thông minh nhất có thể là hoàn thành dự án đúng thời gian với ngăn xếp bạn biết rõ và không bị lỗi.

Xin lỗi về sự liên kết

[1] - http://www.nektoon.com/t/1Z99Daaa

1

Bạn cũng có thể xem xét sử dụng BigPipe để tăng hiệu suất của bạn. Facebook cũng sử dụng nó ồ ạt và đây là những gì họ nói về nó: "Để khai thác tính song song giữa máy chủ web và trình duyệt, BigPipe đầu tiên phá vỡ các trang web thành nhiều phần được gọi là pagelets. (chẳng hạn như "tìm nạp hướng dẫn", "giải mã lệnh", "thực thi", "ghi lại đăng ký", v.v.), BigPipe phá vỡ quá trình tạo trang thành nhiều giai đoạn:

Yêu cầu phân tích cú pháp: máy chủ web phân tích cú pháp và kiểm tra tính chính xác Yêu cầu HTTP Tìm nạp dữ liệu: máy chủ web tìm nạp dữ liệu từ tầng lưu trữ Tạo điểm đánh dấu: máy chủ web tạo đánh dấu HTML cho phản hồi. Vận tải mạng: phản hồi được truyền từ máy chủ web đến trình duyệt. Tải xuống CSS: tải xuống trình duyệt CSS theo yêu cầu của trang. Xây dựng cây DOM và tạo kiểu CSS: trình duyệt xây dựng cây DOM của tài liệu và sau đó áp dụng các quy tắc CSS trên đó. Tải xuống JavaScript: tải xuống trình duyệt Tài nguyên JavaScript được tham chiếu bởi trang. Thực thi JavaScript: trình duyệt thực thi mã JavaScript của trang.

Ba giai đoạn đầu tiên được thực thi bởi máy chủ web và bốn giai đoạn cuối cùng được thực thi bởi trình duyệt. Mỗi pagelet phải trải qua tất cả các giai đoạn này theo tuần tự, nhưng BigPipe cho phép một số pagelets được thực thi đồng thời trong các giai đoạn khác nhau. "

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