2013-04-28 24 views
5

Đây là cách sử dụng đơn giản của chúng tôi: user2 muốn sao chép tài liệu của người dùng1 vào kho lưu trữ của chính họ trong ứng dụng của chúng tôi. Nên đơn giản, phải không? Tất cả những gì chúng ta cần làm là tạo ra một đốm màu giống hệt nhau trong blobstore với khóa được trả về mà chúng ta có thể liên kết với user2. Chúng ta phải thiếu một cái gì đó ở đây. Có vẻ như chức năng chính của công cụ ứng dụng blob store là xử lý các blobs được tải lên và tải xuống trình duyệt và thao tác sao chép đơn giản được khởi xướng phía máy chủ không đơn giản như vậy.Cách tốt nhất tạo bản sao của thực thể blobstore trên công cụ ứng dụng trong Java là gì?

Giải pháp rõ ràng dường như đang sử dụng api tệp thử nghiệm trong java, nhưng không có tình yêu. Nó hoạt động, cho đến khi bạn nhận được trong kích thước tập tin vượt quá một MB hoặc như vậy, sau đó nó không thành công, phần nào không thể đoán trước. Đọc tất cả vào lớp máy chủ cũng có vẻ ngớ ngẩn, khi chúng ta chỉ cần tạo một bản sao trong lớp lưu trữ. Ngoài ra, tỷ lệ cược của chúng tôi nhận được một tính năng thử nghiệm thông qua vào môi trường sản xuất của chúng tôi là mỏng, mặc dù khác không.

Một số thông tin về môi trường của chúng tôi: ứng dụng được viết bằng Java và chúng tôi đang sử dụng blobstore, không phải lưu trữ đám mây và cam kết với nó ngay bây giờ. Chúng tôi là một nhóm bộ phận nhỏ và muốn làm cho trường hợp công cụ ứng dụng là một nền tảng tuyệt vời để sử dụng, nhưng điều này khiến chúng tôi bối rối. S3 làm cho điều này đơn giản một cách mù quáng, có phải chúng ta đang thiếu một cái gì đó thực sự ngu ngốc ở đây?

+1

Vì không thể sửa đổi các đốm màu, tại sao tạo bản sao? Chỉ có một tham chiếu khác cho cùng một đốm màu cho user2.Nếu người dùng được phép xóa nội dung của blob, hãy kiểm tra bộ đếm tham chiếu trước khi thực sự xóa nó khỏi blobstore. –

+0

Chúng tôi nghĩ về điều đó nhưng bị loại bỏ khá nhanh vì người dùng có thể xóa. Với sự sang trọng của một đốm màu duy nhất và nỗi đau của việc sao chép, đây là một giá trị khác. Điều gì sẽ là cách tốt nhất để mô hình hóa điều này? Một thực thể tham chiếu chéo để theo dõi xem một blob có nhiều hơn một tham chiếu hay không - tạo một mục trong thực thể tham chiếu chéo khi một blob được 'sao chép' và cộng/trừ một bộ đếm hoặc id mỗi khi nó được 'sao chép' hoặc 'xóa' cho đến khi chỉ có một tham chiếu. Chúng tôi đã có những thách thức của chúng tôi với các quầy và lưu trữ dữ liệu, do đó, thực sự xóa khi nó chỉ là một tài liệu tham khảo cuối cùng là một chút đáng sợ. – coleMan

+0

Sau một số cuộc tranh luận, chúng tôi đã quyết định đi theo một biến thể của gợi ý của Kalle. Trả lời dưới đây trong trường hợp nó sẽ giúp người khác. Ngoài ra, trong tầm nhìn, chúng tôi nghĩ rằng chúng tôi đã có một câu hỏi thực hiện mã, nhưng hóa ra lại là một câu hỏi kiến ​​trúc có lẽ phù hợp hơn cho việc trao đổi ngăn xếp chương trình. – coleMan

Trả lời

1

Chúng tôi đã loại bỏ ý tưởng tạo một bản sao lập trình của blob với tệp api và đi kèm với tham chiếu như Kalle đề xuất trong nhận xét của mình và tạo một thực thể xref mới lưu trữ thông tin về bản sao và bản gốc. Khi một hình ảnh hoặc tập tin bị xóa, chúng tôi kiểm tra thực thể xfef để tham khảo và xóa các đối tượng trỏ đến ảnh/tệp đó (tức là được tạo nếu ảnh/tệp đã xóa được sao chép từ một tệp khác). Nếu chúng ta không tìm thấy bất kỳ xrefs nào cả, chúng ta sẽ xóa chính blob đó. Chúng tôi không thích những ý nghĩa riêng tư/tuân thủ của việc để lại những đốm màu mồ côi đang nằm xung quanh, và mặc dù dung lượng rẻ mỗi $$$ giúp. Chúng tôi cũng thích ý tưởng giữ một ngôi nhà sạch sẽ để nói chuyện.

0

Giải pháp 1: Tôi sẽ khởi chạy phiên bản Google Compute Engine và sử dụng lệnh gsutil để sao chép.

Sau đó tắt phiên bản khi hoàn thành. Đây là cách nhanh nhất để làm bản sao cho kiến ​​thức của tôi

gsutil documentation

Giải pháp 2: Nhưng cá nhân tôi sẽ chọn để sử dụng một bộ đếm như đã nói trong các ý kiến, bởi vì điểm mà bạn nói là ý chí đáng sợ là vấn đề tương tự với bản sao. Vì vậy, chỉ cần sử dụng bộ đếm với thử nghiệm đơn vị mạnh mẽ trên những ví dụ đó sẽ ít đáng sợ hơn.

Một ý tưởng để làm cho nó ít đáng sợ hơn là khi bạn đạt đến 0 cho truy cập của bạn, bạn không xóa blob ngay lập tức nhưng làm một công việc để làm điều này sau này. Bằng cách sử dụng Scheduled task trong Google App Engine. Và xóa các tập tin và hồ sơ thực tế của bạn của nó một tháng sau đó ví dụ.

0

Như đã đề cập trong nhận xét, hãy giữ một đốm màu và chuyển khóa xung quanh. Nhưng bạn thực sự không bao giờ cần xóa. Nó là thực hành tốt để giữ cho các blob cho mục đích lưu trữ. Vậy làm thế nào để delete thực sự hoạt động? Trong mô hình kho dữ liệu của bạn, có một trường boolean delete. Bạn không xóa khóa blob khỏi thực thể khi xóa. Nhưng đúng hơn, bạn đánh dấu trường boolean là true. Bằng cách này, sản phẩm của bạn có hồ sơ về mọi người dùng đã từng sở hữu tệp. Nhưng người dùng không cần phải biết.

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