2012-05-07 24 views
6

Tôi hiện đang viết một ứng dụng Node và tôi đang suy nghĩ trước về mở rộng quy mô. Theo tôi hiểu, việc chia tỷ lệ theo chiều ngang là một trong những cách dễ dàng hơn để mở rộng ứng dụng để xử lý nhiều yêu cầu đồng thời hơn. Bản sao làm việc của tôi hiện đang sử dụng MongoDb trên chương trình phụ trợ.Nhiều phiên bản nút với một cơ sở dữ liệu duy nhất

Câu hỏi của tôi là như vậy: Tôi có cấu trúc dữ liệu giống như danh sách được liên kết yêu cầu duy trì trật tự. Mối quan tâm của tôi (tưởng tượng) là khi có điều kiện chủng tộc cho cơ sở dữ liệu qua nhiều trường hợp nút, có thể độ phân giải của danh sách được liên kết sẽ không chính xác.

Để đưa ra ví dụ: Hãy tưởng tượng máy chủ có danh sách này a-> b. Ví dụ 1 đi kèm với đối tượng c và instance 2 đi kèm với đối tượng d. Có thể có một điều kiện chủng tộc trong đó cả hai trường hợp đọc a-> b và quyết định gắn thêm các đối tượng của riêng chúng vào danh sách. Ví dụ 1 sau đó sẽ tưởng tượng nó được chèn là a-> b-> c trong khi dụ 2 nghĩ rằng đó là a-> b-> d khi cơ sở dữ liệu thực sự chứa a-> b-> c-> d. Nói chung, điều này nghe giống như một công việc cho khóa lạc quan, tuy nhiên, như tôi hiểu, không MongoDB hay Redis (cơ sở dữ liệu khác mà tôi đang xem xét) thực hiện giao dịch theo cách SQL.

do đó tôi tưởng tượng ra giải pháp cho là một trong những dưới đây:

  1. Thực hiện giao dịch của riêng tôi trong MongoDB sử dụng cờ. Máy khách thực hiện findAndModify trên biến khóa và nếu thành công, thực hiện các thao tác. Nếu không thành công, khách hàng sẽ thử lại sau một thời gian chờ nhất định.

  2. Sử dụng giao dịch Redis và pubsub để đạt được hiệu quả tương tự. Tôi không chắc chắn làm thế nào để làm điều này được nêu ra, nhưng nó có vẻ như nó có thể là chính đáng.

  3. Triển khai một số loại cân bằng tải thông minh. Nếu nhiều máy khách đang hoạt động trên cùng một mục, hãy định tuyến chúng đến cùng một cá thể. Vì JS là luồng đơn, vấn đề sẽ được giải quyết. Thật không may, tôi đã không tìm thấy một giải pháp đơn giản cho điều đó.

Tôi chắc chắn có một cách tốt hơn, thanh lịch hơn để đạt được điều này và tôi rất muốn nghe bất kỳ giải pháp hoặc đề xuất nào. Cảm ơn bạn!

+3

+1 chỉ để sử dụng node.js + mongodb –

+0

Đồng thời xem neo4j nếu dữ liệu của bạn trông giống một biểu đồ hơn tập hợp tài liệu ... –

+0

Cảm ơn :) Tôi cũng sẽ xem xét điều đó . – johncch

Trả lời

0

Nếu tôi hiểu chính xác và danh sách đang được lưu trữ dưới dạng một tài liệu, bạn có thể đang xem xét phiên bản hàng. Vì vậy, thêm một thuộc tính vào tài liệu mà sẽ xử lý phiên bản, khi bạn cập nhật, bạn tăng (hoặc thay đổi) phiên bản và bạn thực hiện điều đó một bản cập nhật có điều kiện:

// cập nhật (điều kiện, giá trị)

cập nhật ({version: whateverYouReceivedWhenYouDidFind}, newValue)

Hy vọng điều đó sẽ hữu ích. Gus

0

Bạn muốn lệnh findAndModify trên mongodb sẽ đảm bảo sửa đổi nguyên tử trong khi trả lại tài liệu mới được sửa đổi. Khi thay đổi này là nối tiếp và nguyên tử Ví dụ 1 sẽ có a-> b-> c và dụ 2 sẽ có a-> b-> c-> d

Cheers

+0

Thật không may tôi sẽ cần phải làm một số chế biến ở giữa các lệnh tìm và sửa đổi để nó có vẻ như nó sẽ không thể sử dụng API mongo này? – johncch

0

Nếu tất cả các bạn đang làm là thêm mới các yếu tố vào danh sách, bạn có thể sử dụng danh sách Redis và bao gồm thời gian trong mọi giá trị bạn thêm. Danh sách này có thể được phân loại trên redis nhưng nên nhanh chóng sắp xếp lại khi được truy xuất.

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