2010-12-30 33 views
8

Tôi đang làm việc trên một ứng dụng web, trong đó lịch sử được xây dựng trên một chồng PHP/MySQL.Việc sử dụng máy chủ web có trạng thái có ý nghĩa không?

Một trong số chúng hoạt động chính của ứng dụng phải thực hiện một số tính toán nặng cần lặp lại trên mỗi hàng của toàn bộ bảng DB. Không cần phải nói đây là một nút cổ chai nghiêm trọng. Vì vậy, một quyết định đã được thực hiện để viết lại toàn bộ quá trình trong Java.

Điều này đã cho chúng tôi hai lợi ích. Một là Java, như một ngôn ngữ, nhanh hơn nhiều so với một tiến trình PHP. Thứ hai là chúng ta có thể duy trì toàn bộ tập dữ liệu trong bộ nhớ máy chủ ứng dụng Java. Bây giờ chúng ta có thể thực hiện các phép tính nặng trong bộ nhớ, và mọi thứ diễn ra nhanh hơn nhiều.

Điều này làm việc một lúc, cho đến khi chúng tôi nhận ra rằng chúng tôi cần phải mở rộng quy mô, vì vậy hiện tại chúng tôi cần nhiều máy chủ web hơn.

Vấn đề là - theo thiết kế hiện tại, tất cả đều phải duy trì chính xác cùng một trạng thái. Tất cả họ đều truy vấn DB, xử lý dữ liệu và duy trì nó trong bộ nhớ. Nhưng điều gì xảy ra khi bạn cần thay đổi dữ liệu này? Làm thế nào để tất cả các máy chủ duy trì tính nhất quán?

Kiến trúc này có vẻ không đúng với tôi. Lợi ích hiệu suất từ ​​việc giữ tất cả các dữ liệu trong bộ nhớ là hiển nhiên, nhưng điều này nghiêm trọng cản trở khả năng mở rộng.

Các tùy chọn từ đây là gì? Chuyển sang bộ nhớ trong, khóa-giá trị, lưu trữ dữ liệu? Chúng ta có nên từ bỏ trạng thái giữ bên trong các máy chủ web hoàn toàn không?

Trả lời

4

giờ chuyển sang Erlang :-)

yeah, đó là một trò đùa; nhưng có một sự thật. vấn đề là: ban đầu bạn đã có trạng thái của bạn trong một kho lưu trữ được chia sẻ bên ngoài: DB.bây giờ bạn có nó (một phần) được tính toán trước trong một kho lưu trữ không chia sẻ nội bộ: các đối tượng Java RAM. Cách rõ ràng là để nó vẫn được tính toán trước nhưng trong một kho lưu trữ chia sẻ bên ngoài, thì càng nhanh càng tốt.

Một câu trả lời dễ dàng được ghi nhớ.

Một cách khác là xây dựng 'máy chủ calc' của riêng bạn, tập trung vào cả nhiệm vụ tính toán và kết quả (một phần). Các quy trình giao diện người dùng web chỉ truy cập vào máy chủ này. Trong Erlang nó sẽ là cách tự nhiên để làm điều đó. Trong các ngôn ngữ khác, bạn sill có thể làm điều đó, chỉ cần làm việc nhiều hơn. Kiểm tra ZeroMQ để cảm hứng, ngay cả khi bạn không sử dụng nó cuối cùng (nhưng đó là một thực hiện tốt chết tiệt).

+0

+1 cho hạt của sự thật. – duffymo

1

Điều này có thể là sự sáo rỗng, nhưng dữ liệu luôn mở rộng để lấp đầy không gian bạn đặt vào. Dữ liệu của bạn có thể vừa trong bộ nhớ ngày hôm nay nhưng tôi đảm bảo rằng bạn sẽ không mất thời gian trong tương lai. Làm thế nào xa đó là khung thời gian bạn phải tìm ra một kiến ​​trúc tốt hơn. Tính trạng thái của ứng dụng của bạn chỉ là một triệu chứng của vấn đề lớn hơn này.

Mọi người có thực hiện các phép tính khác nhau trên toàn bộ tập dữ liệu không? Đây có phải là điều bạn có thể làm trong một đợt qua đêm và có người truy cập vào ban ngày không? Làm thế nào thời gian nhạy cảm là nó?

Tôi nghĩ rằng đây là những câu hỏi bạn cần trả lời bởi vì tại một số điểm bạn sẽ không thể mua đủ bản ghi nhớ để lưu trữ dữ liệu bạn cần. Điều đó nghe có vẻ ngớ ngẩn khi bạn ở đây, nhưng bạn nên lên kế hoạch cho sự thật. Nhiều nhà phát triển mà tôi đã nói chuyện không nghĩ về thành công trông như thế nào và tác động của nó đến thiết kế của họ.

+0

Tôi hoàn toàn đồng ý với bạn. Chúng tôi * sẽ * đạt đến một điểm mà giữ tất cả dữ liệu này trong bộ nhớ sẽ là một vấn đề. Giải pháp nào tồn tại cho tình huống này? Dữ liệu K-V có lưu trữ một tùy chọn không? Lưu trữ một lần cho tất cả các máy chủ web? Hoặc hơn nữa, nếu dữ liệu thô được lưu trữ trong một DB nặng trên backend, nơi nào bạn lưu trữ siêu dữ liệu mà nên được dễ dàng truy cập? –

+0

Tôi không biết đầy đủ về bản chất của dữ liệu hoặc tính toán của bạn để giúp bạn. – n8wrl

1

Tôi đồng ý với bạn - điều này nghe có vẻ thiếu sót, nhưng tôi cần biết thêm chi tiết để biết chắc chắn.

Bạn đề cập đến tập dữ liệu lớn và tính toán nặng, nhưng bạn không nói về cách dữ liệu được cập nhật, khi tính toán được thực hiện, cho dù đó là giá trị trong ngày hay toàn bộ tập dữ liệu, v.v. rất giống như một công việc hàng loạt có thể được thực hiện hàng ngày off-line.

Nếu trường hợp đó xảy ra, tôi không chắc chắn về mối quan hệ trên web với nó. Người dùng web của bạn có đang thực hiện các truy vấn tùy chỉnh sau khi thực hiện việc crunching không? Dữ liệu chỉ đọc hoặc đọc chủ yếu cho người dùng? Hay họ đang thay đổi dữ liệu liên tục khi đang bay?

Tôi tự hỏi liệu công nghệ kiên trì mà bạn đã chọn có ảnh hưởng đến mọi thứ không? Có lẽ một thay thế NoSQL có thể tốt hơn cho vấn đề của bạn - giống như một cụm MongoDB phân tán.

+0

Nói một cách tự nhiên, việc lưu trữ siêu dữ liệu giúp tính toán nặng chạy nhanh hơn ở đâu? –

1

Đây là câu hỏi về công cụ dữ liệu, tôi tin rằng, đó là câu hỏi phân phối trên máy chủ web. Tại sao công cụ cơ sở dữ liệu (trung tâm) của bạn không thể tính toán (đủ nhanh)?

Bạn có thể lưu trữ các giá trị được tính toán trước được gắn cờ là cũ khi dữ liệu cơ bản được thay đổi, yêu cầu phải tính toán lại. Không có xung quanh sự cần thiết phải tính toán lại khi thay đổi dữ liệu. Bạn chỉ cần quản lý thời gian và cách thức thay đổi xảy ra vì nó sẽ ảnh hưởng đến người tiêu dùng dữ liệu.

+0

Cơ sở dữ liệu chỉ giữ dữ liệu thô. Nó không được xây dựng để chứa siêu dữ liệu có nguồn gốc từ dữ liệu thô. –

+1

Tôi không nghĩ rằng việc tính toán dựa trên dữ liệu "siêu dữ liệu" là đúng. Thuật ngữ đó có thể gây hiểu nhầm. Siêu dữ liệu là dữ liệu về dữ liệu, không phải dữ liệu được lấy từ dữ liệu. Trong mọi trường hợp, công cụ dữ liệu là IMO là nơi thích hợp và đơn giản nhất để giải quyết câu hỏi. Thay thế là một chương trình phức tạp, nơi khách hàng của dữ liệu đăng ký dịch vụ thay đổi xuất bản, để họ có thể làm mới các bản sao được phân phối cục bộ của bộ dữ liệu cốt lõi của họ. – Tim

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