
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 dụng web của GAE với Gaelyk, JSON và Ajax
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 dựng ứng dụng nhanh, bằng cách sử dụng các công cụ mà bạn yêu thích.
Andrew Glover gói ghém mô hình miền domain dành cho ứng dụng khai phá
Twitter của mình, thêm các móc nối 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 và Ajax thông qua thư viện JavaScript được nhiều người
ưa thích là JQuery.
Lập chỉ mục và lưu dữ liệu vào một bộ nhớ đệm với Objectify-Appengine
Theo mặc định, tất cả các thuộc tính được định nghĩa trong một đố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 cuối. Tuy nhiên, việc
lập chỉ mục cũng tốn chi phí: khi đối tượng mới được tạo ra — chẳng hạn như một
hàng mới, theo thuật ngữ quan hệ hoặc Entity (Thực thể) mới trong Bigtable —
bạn phải 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 (mối quan tâm này cũng giống như

với đồng đô la vậy). Khi bạn đă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 số này ra thì bạn sẽ phải trả thêm tiền. Giống
như vậy, nếu bạn vượt quá 6,50 giờ CPU mỗi ngày, bạn sẽ bắt đầu nhận 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à bạn 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 bạn thấy cách sử dụng chú giải @Unindexed của
Objectify để tắt một chỉ mục cụ thể.
Tôi đã mở rộng đối tượng Retweet từ Phần 1, bằng cách thêm một số chức năng
lập chỉ mục. Bạn có thể thấy những thay đổi này trong gói mã ví dụ mẫu. 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 là
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 mới 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 cần 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. Liệt kê 1 cho thấy tôi đã cải 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 nạp lại
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 và userPicture— là các thuộc
tính mới và cả hai đề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, tên người dùng chính
là tên chính thức của bạn — "Andrew Glover" — còn tên hiển thị trên màn hình là
tên làm việc của bạn — "aglover".)

Lưu dữ liệu 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
nghiệm của người dùng đầu cuối: nó loại bỏ yêu cầu truyền dữ liệu khứ hồi đến
kho dữ liệu và quay về, do đó giúp cho việc đọc dữ liệu nhanh hơn. Google App
Engine sử dụng bộ nhớ đệm trên web (memcache) để lư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à —hô 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ú giải @Cached cho cả hai đối tượng miền của tôi —User và
Retweet. Liệt kê 2 cho thấy đối tượng User đã được cập nhật và thêm vào vài thuôc
tính @Unindexed:
Liệt kê 2. Lưu dữ liệu vào một bộ nhớ đệm thật là đơn giản!
@Cached
public class User {
@Id private String name;
@Unindexed private String token;
@Unindexed private String tokenSecret;
//...