5

Tôi đang tạo một ứng dụng iOS dành cho thiết bị di động. Người dùng có thể tạo tài khoản và tải lên các chuỗi. Nó sẽ giống như twitter, bạn có thể theo dõi mọi người, có hình ảnh hồ sơ, vv Tôi không thể ước tính cơ sở người dùng, nhưng nếu ứng dụng cất cánh, tổng số liệu có thể khá lớn.SimpleDB Chọn VS DynamoDB Quét

Tôi đang lưu trữ các đối tượng thực tế trên Amazon S3 và các khóa trên DataBase, liệt kê các khóa Amazon S3 là chậm. Vì vậy, sẽ tốt hơn cho việc lưu trữ khóa?

Đây là kiến ​​thức của tôi về SimpleDB và DynamoDB:

SimpleDB:

  • giá rẻ
  • Thực hiện tốt
  • Được thiết kế cho bộ dữ liệu trung bình/nhỏ
  • có thể truy vấn sử dụng chọn biểu

DynamoDB:

  • đắt
  • Vô cùng khả năng mở rộng
  • Thực hiện vĩ đại; millisecond phản ứng
  • Không thể truy vấn

Những điểm này là chính xác để hiểu biết của tôi, DynamoDB là thêm về kẻ giết người. tốc độ và khả năng mở rộng, SimpleDB là nhiều hơn về truy vấn và giá cả (vẫn cung cấp hiệu suất tốt). Nhưng nếu bạn nhìn vào nó theo cách này, sẽ nhanh hơn, tải xuống tất cả các phím từ DynamoDB, hoặc thực hiện một truy vấn chọn với SimpleDB ... phải không? Một người đang sử dụng cơ sở dữ liệu cực nhanh để tải xuống (và sau đó chúng tôi phải đối sánh chúng) và người kia đang sử dụng cơ sở dữ liệu hiệu suất hợp lý để truy vấn và tải xuống một số đối tượng chính xác. Vì vậy, đó là nhanh hơn:

DynamoDB tải tất cả mọi thứ và khớp HOẶC SimpleDB truy vấn và tải rằng

(Chú ý: Kết hợp chỉ có nghĩa là sử dụng -rangeOfString và so sánh chuỗi, tiêu thụ không có gì sức mạnh hoặc không thời gian hiệu quả hoặc bất cứ điều gì phía máy chủ)

phím

My S3 sẽ sử dụng định dạng này cho tất cả các loại đối tượng

accountUsername: typeOfObject: randomGeneratedKey

Ví dụ:Nếu bạn đang tham chiếu đến một đối tượng tài khoản

Rohan: Tài khoản: shd83SHD93028rF

Hoặc một hình ảnh hồ sơ cá nhân:

Rohan: ProfilePic: Nck83S348DD93028rF37849SNDh

Tôi có khóa được tạo ngẫu nhiên cho tính duy nhất, nó không đề cập đến bất cứ điều gì, nó chỉ đơn giản là ở đó để các khóa không lặp lại trong đó chồng chéo hai đối tượng.

Trong ứng dụng của tôi, tôi có thể chọn SimpleDB hoặc DynamoDB, vì vậy đây là hai lựa chọn:

  • Sử dụng SimpleDB, cửa hàng phím với các định dạng nhưng không sử dụng định dạng cho bất kỳ tài liệu tham khảo, thay vì sử dụng các thuộc tính được lưu trữ với SimpleDB. Vì vậy, tôi lưu trữ khóa với các thuộc tính như tên người dùng, loại và có thể những người khác tôi cũng sẽ phải bao gồm trong định dạng khóa. Vì vậy, nếu tôi muốn lấy đối tượng tài khoản từ người dùng 'Rohan'. Tôi chỉ sử dụng SimpleDB Chọn để truy vấn thuộc tính 'username' và thuộc tính 'type'. (nơi tôi đối sánh cho 'tài khoản')

  • DynamoDB, các khóa lưu trữ và mỗi khóa sẽ có định dạng được minh họa. Tôi quét toàn bộ cơ sở dữ liệu trả về mọi khóa duy nhất. Sau đó lấy khóa và tận dụng lợi thế của định dạng khóa, tôi có thể sử dụng -rangeOfString để khớp với cái tôi muốn và sau đó tải xuống từ S3.

Ngoài ra, SimpleDB rõ ràng là phân phối theo địa lý, làm cách nào tôi có thể bật tính năng này?

Vì vậy, nhanh hơn và đáng tin cậy hơn là gì? Sử dụng SimpleDB để truy vấn các khóa bằng các thuộc tính. Hoặc sử dụng DynamoDB để lưu trữ tất cả các khóa, quét (tải xuống tất cả các khóa) và so khớp bằng cách sử dụng ví dụ: -rangeOfString? Tâm trí thực tế rằng đây chỉ là các phím ngắn được trỏ đến các đối tượng S3.

Đây là câu hỏi của tôi trước, và số lượng các đối tượng trong cơ sở dữ liệu sẽ khác nhau về câu trả lời quyết định, nên I:

  • Tạo một chìa khóa riêng biệt/đối tượng cho mọi đối tượng duy nhất một người dùng có
  • Tạo khóa/đối tượng tài khoản và lưu trữ tất cả thông tin bên trong đó

Sẽ có những ưu điểm và nhược điểm khác nhau giữa hai tùy chọn này. Ví dụ, nó sẽ nhanh hơn để lấy ra nếu nó là tất cả riêng biệt, nhưng nó cũng được tổ chức hơn và ít lớn hơn của một tập dữ liệu để lưu trữ nó trong một tài khoản người dùng.

Vì vậy, bạn nghĩ sao?

Cảm ơn sự giúp đỡ! Tôi đã đặt một tiền thưởng về điều này, thực sự cần một câu trả lời càng sớm càng tốt.

+0

Chỉ cần một vài ghi chú cho rõ ràng vì lợi ích: 1. DynamoDB không có một hoạt động truy vấn, nó chỉ đòi hỏi sử dụng một RangeKey. 2. Thao tác quét cho phép bạn tìm dữ liệu trên toàn bộ bảng, nhưng không yêu cầu bạn tải xuống toàn bộ bảng. 3. SimpleDB có bản sao dư thừa trong cùng một vùng miền của bạn được tạo ra, nó không hoạt động như một CDN cho cơ sở dữ liệu của bạn. –

+0

@BobKinney ý của bạn là gì, bạn có thể tìm thấy dữ liệu trong toàn bộ bảng nhưng không cần tải xuống? – MCKapur

+0

Tôi có nghĩa là chính xác những gì tôi đã nói. Thao tác quét sẽ quét tất cả dữ liệu trên bảng DynamoDB và chỉ trả lại các mục trong bảng khớp với thông số quét của bạn và chỉ những mục này sẽ cần được tải xuống ứng dụng của bạn. Các hoạt động quét có thể bị ràng buộc để bạn chỉ tìm kiếm kết quả phù hợp N đầu tiên, nhưng nó sẽ sử dụng nhiều thông lượng đọc khi cần thiết để tìm ra các kết quả N đó. –

Trả lời

6

Wow!Thật là một câu hỏi :)

Ok, cho phép thảo luận về một số khía cạnh:

S3

S3 Hiệu suất thấp rất có thể là bạn không thêm một tiền tố cho Liệt kê Keys.

Nếu bạn sharding bằng cách lưu trữ các đối tượng như: type/owner/id, liệt kê tất cả các id cho một chủ sở hữu nhất định (tiền tố là loại/chủ sở hữu /) sẽ được nhanh chóng. Hoặc ít nhất, nhanh hơn liệt kê mọi thứ cùng một lúc.

Dynamo so với SimpleDB

Nói chung, đó là lời khuyên của tôi:

  • Sử dụng SimpleDB khi:

    • lưu trữ thực thể của bạn sẽ không vượt qua 10GB
    • Bạn cần áp dụng các truy vấn phức tạp liên quan đến nhiều trường
    • Quer của bạn ies không được xác định rõ
    • Bạn có thể tận dụng từ Multi-Valued loại dữ liệu
  • Sử dụng DynamoDB khi:

    • lưu trữ thực thể của bạn sẽ vượt qua 10GB
    • Bạn muốn mở rộng nhu cầu/thông lượng khi nó đi
    • Truy vấn và mô hình của bạn được xác định rõ và không thay đổi.
    • Mô hình của bạn là năng động, liên quan đến một schema lỏng
    • Bạn có thể cache trên client-side của bạn truy vấn của bạn (vì vậy bạn có thể tiết kiệm thông bằng cách truy vấn bộ nhớ cache trước Dynamo)
    • Bạn muốn làm tổng hợp/rollup tóm tắt, bằng cách sử dụng nguyên tử cập nhật

Với mô tả hiện tại của bạn, có vẻ như SimpleDB thực sự là tốt hơn, vì: - mô hình của bạn không hoàn toàn được xác định - bạn có thể trì hoãn một số khía cạnh quyết định, vì nó mất một thời gian để đạt được (10G iB) giới hạn

Địa lý SimpleDB

Nó không hỗ trợ. Nó chỉ hoạt động từ chúng tôi-đông-1 afaik.

Đặt tên khóa

Điều này áp dụng nhiều nhất cho Dynamo: Bất cứ khi nào bạn có thể, hãy sử dụng khóa Hash + Range.Nhưng bạn cũng có thể tạo ra các phím sử dụng Hash, và áp dụng một số thắc mắc, như:

  • Liệt kê tất cả các hồ sơ của tôi trên bàn T mà bắt đầu với accountid:
  • Liệt kê tất cả các hồ sơ của tôi trên bàn T mà bắt đầu với accountid:image

Tuy nhiên, đó là Quét tất cả. Ghi nhớ điều đó.

(Xem này cho một cái nhìn tổng quan: http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/API_Scan.html)

Bonus Track

Nếu bạn đang sử dụng Java, mây dữ liệu trên Maven Trung ương bao gồm SimpleJPA với một số phần mở rộng vào Map Blob Fields để S3. Vì vậy, cung cấp cho nó một cái nhìn:

http://bitbucket.org/ingenieux/cloudy

Cảm ơn bạn

+0

Cảm ơn! Rất yên tâm – MCKapur

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