Cạm bẫy khả năng mở rộng trang web phổ biến nhất


8

Chúng tôi đang thiết kế một ứng dụng trang web / web nơi chúng tôi hy vọng sẽ đạt được số lượng người dùng cao và nói chung, sử dụng rất nhiều. Cụ thể hơn, chúng tôi dự định sử dụng PHP làm ngôn ngữ lập trình / kịch bản và MySQL cho nhu cầu DB quan hệ khi bắt đầu. Chúng tôi vẫn chưa tìm ra có nên sử dụng cơ sở dữ liệu NoQuery hay không.

Liên quan đến điều đó, chúng tôi muốn thiết kế với khả năng mở rộng trong tâm trí. Những cạm bẫy khả năng mở rộng phổ biến nhất cho các trang web là gì? Các lĩnh vực chính mà chúng ta cần phải xem xét, để hệ thống có thể dễ dàng mở rộng là gì?


bạn đang xem xét nền tảng lưu trữ nào?
mhoran_psprep

1
điều này cảm thấy giống như một danh sách / câu hỏi litany.
Michael Brown

Khả năng mở rộng với PHP? Chúc may mắn. Sử dụng tốt hơn Zend.
Jordan

@Jordan: có một số trang web chạy PHP có hàng tỷ lượt xem trang mỗi tháng. (netlog, wikipedia, facebook, tumblr, flickr)
Joeri Sebrechts

1
Có, và mỗi người trong số họ có cơ sở hạ tầng lớn để hỗ trợ nó, hoặc trong trường hợp ít nhất là facebook và tumblr, bỏ qua nó hoàn toàn.
Jordan

Câu trả lời:


11

Tôi sẽ thêm vào một điều rất phổ biến - tối ưu hóa ở sai chỗ. Tôi đã thấy hàng tấn bài viết xung quanh thảo luận về sự khác biệt nano giây trong các cấu trúc cú pháp PHP nhưng ít hơn là thảo luận về cách thiết kế cơ sở hạ tầng bộ nhớ đệm đúng cách cho một ứng dụng. Vì vậy, như nó đã được ghi nhận, thử nghiệm. Nhưng không chỉ kiểm tra - hồ sơ và tìm hiểu chính xác những gìchậm - có bị ràng buộc CPU không? I / O bị ràng buộc? Ký ức bị ràng buộc? Có phải đó là các truy vấn cơ sở dữ liệu đưa bạn xuống, nó đang đọc các tệp, nó có tính toán không? Bạn có thể loại bỏ nó hoặc làm lại nó để nó hoạt động nhanh hơn? V.v. Đừng bắt đầu với "hãy sử dụng NoQuery vì nó nhanh hơn". Bắt đầu với "chúng tôi muốn làm điều này và điều đó, điều gì sẽ là nút thắt? Làm thế nào để chúng tôi loại bỏ chúng? Nó sẽ hoạt động như thế nào nếu chúng tôi có được 100 người dùng?" Không biết nhiều hơn về khối lượng công việc và ứng dụng, thật khó để nói bất cứ điều gì cụ thể, nhưng tôi sẽ bắt đầu với việc suy nghĩ những gì bạn có thể lưu trữ và làm thế nào để giảm hệ thống tập tin / cơ sở dữ liệu / vv. truy cập và đặc biệt là sửa đổi (vì những điều đó cũng sẽ làm mất hiệu lực bộ đệm).


6

Cạm bẫy khả năng mở rộng phổ biến nhất là không thực hiện kiểm tra tải sớm. Nếu bạn thiết lập các thử nghiệm mô phỏng thứ gì đó tương đương với tải dự kiến ​​của bạn trong quá trình phát triển, thì bạn sẽ có thể phát hiện và sửa bất kỳ trở ngại công nghệ hoặc kiến ​​trúc nào về khả năng mở rộng trước khi chúng trở nên quá đắt để khắc phục.


5

Một số ví dụ hay về nhân rộng với PHP: Tumblr , Flickr , Netlog

Lời khuyên phổ biến được đưa ra về khả năng mở rộng:

  • Giữ cho nó đơn giản!
    Đừng bỏ qua hoặc mua vào các giải pháp dành riêng cho nhà cung cấp.
  • Kiến trúc không chia sẻ
    Giữ trạng thái của bạn trong cơ sở dữ liệu và tắt máy chủ ứng dụng của bạn (tránh dữ liệu phiên thậm chí trên máy chủ). Bằng cách này, bạn có thể dễ dàng thêm các máy chủ ứng dụng bổ sung khi cần thiết.
  • Tập trung vào bộ đệm ẩn phía trước (tệp tĩnh)
    Sử dụng proxy ngược và sau này trên CDN. Bất cứ điều gì không phải được phục vụ từ máy chủ ứng dụng thì tải ít hơn trên máy chủ đó.
  • Đo lường hệ thống thực
    Xây dựng trong giám sát để bạn biết nơi tắc nghẽn của mình. Đảm bảo rằng bạn có thể dự đoán tải trong tương lai dựa trên các đường cong tăng trưởng.
  • Hãy chú ý đến thiết kế DB của bạn
    Điều chỉnh các truy vấn của bạn, sử dụng memcached để tránh truy vấn hoàn toàn và bảo vệ dữ liệu của bạn qua các trường hợp khi bạn hết không gian thở trên một cá thể DB (theo dõi để biết trước điều này).

Một số cạm bẫy:

  • NoQuery vs SQL là một cá trích đỏ.
    Tất cả các ông lớn đang chạy cốt lõi của họ trên cơ sở dữ liệu SQL. Sử dụng NoQuery nếu bạn chắc chắn rằng nó có ý nghĩa, nhưng đừng sử dụng nó với giả định rằng nó sẽ giải quyết các vấn đề mở rộng của bạn. Nó sẽ không.
  • Hãy cẩn thận về ORM.
    Chúng nặng về máy chủ ứng dụng (mâu thuẫn với kiến ​​trúc không chia sẻ) và chúng yêu cầu bạn hiểu không chỉ cách điều chỉnh các truy vấn SQL, mà còn cách điều chỉnh ORM trên đầu các truy vấn SQL (nói cách khác, chúng chỉ đơn giản hóa mọi thứ nếu hiệu suất không thành vấn đề). Thay vào đó, ưu tiên cho các truy vấn được thiết kế bằng tay và sử dụng memcached tự do.
  • Hệ thống định tuyến / định tuyến nặng trên máy chủ. Giữ ngăn xếp máy chủ có trọng lượng nhẹ.
  • Đừng lo lắng về hiệu suất mã theo từng dòng.
    Bạn luôn có thể truy cập và sửa các điểm nóng sau này (sử dụng xdebug hoặc các công cụ định hình tương tự). Có một kiến ​​trúc có thể mở rộng quan trọng RẤT NHIỀU so với hiệu suất mã, vì vậy hãy đầu tư trí tuệ của bạn cho phù hợp.

+1 vì đã cẩn thận về các ORM. Thêm ORM vào lớp ứng dụng của chúng tôi tăng gấp bốn lần truy vấn DB và DB là nút cổ chai lớn nhất của chúng tôi
CamelBlues

1

Cách thực sự duy nhất để biết bạn có vấn đề về khả năng mở rộng hay không là kiểm tra nó, vì vậy hãy kiểm tra sớm, kiểm tra thường xuyên như Michael Borgwardt nói .

Ngoài ra, một lý do phổ biến khiến các hệ thống không mở rộng được là do sự tranh chấp tài nguyên. Và điều đó thường thể hiện chính nó trong cơ sở dữ liệu --- cố gắng đọc và viết cùng một lúc. Vì vậy, bạn có thể muốn nghĩ về việc sử dụng phương pháp CQRS ngắt kết nối phía đọc (Truy vấn) khỏi phía ghi (Lệnh).


1

Hãy sẵn sàng để bảo vệ tất cả mọi thứ. Nếu bạn có thể phân vùng nó trên nhiều máy chủ, bạn sẽ tiến gần hơn đến việc xây dựng một cái gì đó có thể mở rộng quy mô.

Cũng thiết kế cho trường hợp của một triệu người dùng và giảm quy mô. Không thiết kế cho 1.000 người dùng và tăng quy mô.

Thành thật mà nói PHP và MySQL sẽ không phải là lựa chọn của tôi để làm điều này. Cố gắng làm dữ liệu bị hủy trong MySQL là một nỗi đau ở cổ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.