2011-06-30 22 views
5

Tôi đang viết một ứng dụng ruby ​​trên đường ray và một trong những thành phần quan trọng nhất của trang web là biểu quyết trực tiếp. Chúng tôi hoàn toàn mong đợi rằng chúng tôi sẽ nhận được 10 nghìn yêu cầu bỏ phiếu chỉ trong vòng 1 phút. Cùng với các yêu cầu khác có nghĩa là chúng tôi có thể nhận được rất nhiều yêu cầu. Ý tưởng ban đầu của tôi là thiết lập máy chủ để sử dụng apache + phusion, tuy nhiên, để biểu quyết cụ thể, tôi đang nghĩ về việc viết một tập lệnh php trên mặt và viết/đọc thông tin trong memcached. Dữ liệu chỉ cần tồn tại trong khoảng 15 phút, vì vậy việc ghi vào cơ sở dữ liệu 10.000 lần trong 1 phút dường như vô nghĩa. Chúng tôi cũng cần phải đánh dấu ip của người dùng để họ không bỏ phiếu hai lần như vậy được thêm phức tạp trong memcached.Xử lý hàng trăm yêu cầu đồng thời trong đường ray

Nếu có ai có bất kỳ đề xuất hoặc ý tưởng nào để làm cho tác phẩm này tốt nhất có thể, vui lòng trợ giúp.

+0

Nhìn vào NoSQL dbs và 10k viết một phút là khoảng 165 lần viết/giây. Nó không nhiều đâu. – Viktor

+0

Tôi đã không nghĩ về điều đó, bạn là người nào đáng tin cậy nhất? –

+0

MongoDB cho NoSQL. Nếu bạn đang sử dụng MySQL, hãy sử dụng bảng MyISAM. – Dex

Trả lời

7

Nếu bạn đang kiến ​​trúc một ứng dụng cho loại dòng lớn này, bạn sẽ cần phải loại bỏ các thành phần thiết yếu của nó đến mức tối thiểu tuyệt đối.

Sử dụng ngăn xếp Rails đầy đủ cho loại cường độ đó không thực sự thiết thực, cũng không cần thiết. Sẽ tốt hơn nếu xây dựng một lớp Rack rất mỏng để xử lý việc bỏ phiếu bằng cách thực hiện các cuộc gọi DB trực tiếp, bỏ qua ngay cả một ORM, về cơ bản là một trình bao bọc xung quanh một câu lệnh INSERT. Đây là một cái gì đó Sinatra và Sequel, phục vụ như một máy phát điện truy vấn hiệu quả, có thể giúp đỡ.

Bạn cũng nên đảm bảo điều chỉnh cơ sở dữ liệu của mình đúng cách, đồng thời chạy nhiều lần kiểm tra tải để đảm bảo nó hoạt động như mong đợi, với tỷ lệ lợi nhuận cao hơn.

Thực hiện 10.000 cuộc gọi DB trong một phút không phải là một vấn đề lớn, mỗi cuộc gọi sẽ chỉ mất một phần nhỏ của một phần nghìn giây trên một ngăn xếp được điều chỉnh đúng cách. Memcached có thể cung cấp hiệu suất cao hơn đặc biệt là nếu kết quả không được dự định là vĩnh viễn. Memcached có một toán tử tăng nguyên tử, chính xác là những gì bạn đang tìm kiếm khi chỉ đơn giản là đếm các phiếu. Redis cũng là một cửa hàng tạm thời rất có khả năng.

Một ý tưởng khác là xóa toàn bộ DB và viết một quy trình máy chủ liên tục nói lên một giao thức dựa trên JSON đơn giản. Eventmachine rất tốt cho việc ném những thứ này lại với nhau nếu bạn cam kết với Ruby, cũng như NodeJS nếu bạn sẵn sàng xây dựng một máy chủ kiểm đếm chuyên dụng trong JavaScript.

10.000 hoạt động trong một phút có thể dễ dàng đạt được ngay cả trên phần cứng khiêm tốn bằng cách sử dụng một quy trình máy chủ chuyên dụng mà không phải trả phí cho toàn bộ ngăn xếp DB.

Bạn sẽ phải đảm bảo rằng phạm vi của bạn được xác định rất tốt để bạn có thể kiểm tra và lạm dụng nghiêm túc việc triển khai của mình trước khi triển khai.

Kể từ những gì bạn đang mô tả là, ở lõi rất, một cái gì đó tương đương với một tra cứu băm, mã cần thiết chỉ đơn giản là:

contest = @contest[contest_id] 

unless (contest[:voted][ip]) 
    contest[:voted][ip] = true 
    contest[:votes][entry_id] += 1 
end 

Chạy này vài trăm ngàn lần trong một giây là hoàn toàn thực tế, do đó, chi phí duy nhất sẽ bao quanh một lớp JSON xung quanh nó.

+1

cảm ơn bạn đã phản hồi tuyệt vời. Tôi có lẽ sẽ kiểm tra eventmachine và Sinatra + memcached có vẻ như nó sẽ thực sự hiệu quả mà không đòi hỏi quá nhiều công việc thêm mã hóa là tốt. Vấn đề là, đây là một tính năng duy nhất, tuy nhiên, nó là một yêu cầu cao mà nó cần giải pháp riêng của nó. –

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