Phát triển Java 2.0: Khai phá Twitter với
Objectify-Appengine, Phần 2
Bắt đầu tiến nhanh đến các ng dng web ca GAE vi Gaelyk, JSONAjax
Google App Engine không chỉ mở rộng quy mô các ứng dụng: nó có thể giúp bạn
xây dng ứng dụng nhanh, bằng cách sử dụng các công cụ mà bn yêu thích.
Andrew Glover gói ghém mô hình min domain dành cho ứng dụng khai phá
Twitter của mình, thêm các móc ni tới việc lập chỉ mục và lưu dữ liệu vào một bộ
nhớ đệm. Sau đó ông nối nó với cơ chế cấp phép OAuth của Twitter, các hàng đợi
của GAE, một chút JSON Ajax thông qua thư viện JavaScript được nhiều người
ưa thích là JQuery.
Lp ch mc và lưu d liu o mt b nh đệm vi Objectify-Appengine
Theo mặc định, tất cả các thuộc tính được định nghĩa trong mt đối tượng miền
domain (và do đó, cả với API Entity mức thấp của Google) đều được lập chỉ mục.
Đúng như trong thế giới quan hệ, lập chỉ mục giúp cho việc tìm kiếm kho dữ liệu
bên dưới dễ dàng hơn và nhanh hơn đối với người dùng đu cui. Tuy nhiên, việc
lp chỉ mục cũng tốn chi phí: khi đối tượng mi được tạo ra — chng hạn như một
hàng mi, theo thuật ngữ quan hệ hoặc Entity (Thực thể) mới trong Bigtable
bạn phi cập nhật các chỉ mục của mình để tính đến dữ liệu mới thêm vào này.
Khi bạn bắt đầu sử dụng GAE để lưu trữ và lấy ra dữ liệu từ đó, việc lập chỉ mục
trở thành một mối quan tâm trong thế giới thực (mi quan tâm này cũng giống như
với đồng đô la vậy). Khi bn đăng ký một tài khoản GAE, bạn sẽ tự động nhận
được 200 chỉ mục miễn phí; ngoài snày ra thì bn sẽ phải trả thêm tin. Giống
như vậy, nếu bạn ợt quá 6,50 giờ CPU mỗi ngày, bn sẽ bắt đầu nhn một khoản
nợ của Google. Vì vậy, lập chỉ mục có chọn lọc là việc nên làm. Nếu bạn không
cần lập chỉ mục cho một thuộc tính (tức là bn không có kế hoạch tìm kiếm một
đối tượng miền domain theo thuộc tính riêng l đó), thì việc tắt chỉ mục đó là điều
hợp lý. Trong Liệt kê 1, tôi cho bn thấy cách sử dụng c gii @Unindexed của
Objectify để tắt một chỉ mục cụ thể.
Tôi đã mrộng đối tượng Retweet tPhn 1, bằng cách thêm một số chức năng
lp chỉ mục. Bạn có thể thấy những thay đổi này trong i mã ví d mu. Trong
Liệt kê 1, tôi đã sử dụng chú thích @Unindexed để không lập chỉ mục thuộc tính
tên thực của người dùng của đối tượng Retweet, thuộc tính đó được đặt tên
userName chứ không phải screenName. Tôi cũng đã không lập chỉ mục URL hình
ảnh của người dùng, một tính năng mi cho phép tôi tạo báo cáo tốt hơn trên giao
diện người dùng.
Tôi không lập kế hoạch tìm kiếm các đối tượng Retweet theo các thuộc tính này,
do đó rõ ràng không cn lập chỉ mục cho chúng. Tất nhiên, tôi có thể loại bỏ chú
giải @Unindexed nếu có thứ gì đó thay đổi. Lit kê 1 cho thấy tôi đã ci tiến các
thuộc tính của đối tượng Retweet như thế nào .
Liệt kê 1. Đi tượng Retweet được np li
public class Retweet
@Id private String id;
private String screenName;
private Date date;
private String tweet;
private Long influence;
private Key<User> owner;
private Long tweetId;
@Unindexed private String userName;
@Unindexed private String userPicture;
//...
}
Hai thuộc tính in đậm cuối danh sách userName userPicture— là các thuộc
tính mới và chai đều không được lập chỉ mục. Tôi đã đổi tên userName thành
screenName để tích hợp tốt hơn với Twitter. (Trong Twitter, n người dùng chính
làn chính thức của bạn — "Andrew Glover" — n tên hiển thị trên màn hình
tên làm việc của bạn "aglover".)
Lưu d liu trong memcache
Giống như việc lập chỉ mục, việc lưu dữ liệu vào một bộ nhớ đệm cải thiện trải
nghim của người dùng đầu cuối: nó loại bỏ yêu cu truyn dữ liệu khứ hồi đến
kho dliệu và quay về, do đó giúp cho việc đọc dữ liệu nhanh n. Google App
Engine sdụng bộ nhớ đệm trên web (memcache) để u dữ liệu và Objectify s
dụng chú thích @Cached để cắm vào nó. Chỉ cần thêm @Cached vào các đối
tượng miền của bạn và —biến!— dữ liệu (không phải là đối tượng Java™
tương ứng) được lưu trữ trong memcache và có thể được lấy ra khỏi bộ nhớ khi
ứng dụng đọc.
Tôi đã thêm chú gii @Cached cho cả hai đối tượng miền của tôi —User
Retweet. Liệt kê 2 cho thy đối tượng User đã được cập nhật và thêm vào vài thuôc
tính @Unindexed:
Lit kê 2. Lưu d liu vào mt b nh đệm thật là đơn gin!
@Cached
public class User {
@Id private String name;
@Unindexed private String token;
@Unindexed private String tokenSecret;
//...