Tổng quan

Một phần của tài liệu Nền tảng Google App Engine và ứng dụng xây dựng cổng thông tin điện tử trường cao đẳng nghề số 3 (Trang 37)

Google App Engine là một dịch vụ máy chủ ứng dụng web. “Ứng dụng web” nghĩa là một ứng dụng hoặc một dịch vụ đƣợc truy cập qua web, thƣờng là qua trình duyệt.

Google App Engine đƣợc thiết kế để đặt các ứng dụng có nhiều ngƣời dùng đồng thời. Khi một ứng dụng có thể phục vụ nhiều ngƣời dùng đồng thời mà không giảm hiệu suất, ta nói rằng ứng dụng đó co giãn. Các ứng dụng đƣợc viết cho App Engine co giãn một cách tự động. Khi có càng nhiều ngƣời sử dụng ứng dụng, App Engine càng cấp nhiều tài nguyên hơn cho ứng dụng

và quản lý việc dùng các tài nguyên này. Ứng dụng tự nó không cần biết bất kỳ điều gì về tài nguyên mà nó đang sử dụng.

Không giống các máy chủ web truyền thống hoặc các máy chủ tự quản lý, với Google App Engine, ngƣời dùng chỉ phải trả cho những tài nguyên mà họ dùng. Những tài nguyên này đƣợc đo bằng gigabyte mà không thu phí hàng tháng hay phí trả trƣớc. Các tài nguyên phải trả phí gồm phí sử dụng CPU, phí lƣu trữ hàng tháng, băng thông đi và đến, một số tài nguyên cho các dịch vụ App Engine. Lúc đầu, các lập trình viên sẽ đƣợc cấp cho một lƣợng tài nguyên nhất định, đủ cho các ứng dụng nhỏ với lƣu lƣợng thấp. Google ƣớc lƣợng rằng với nguồn tài nguyên miễn phí, một ứng dụng có thể cho phép khoảng 5 triệu lƣợt xem mỗi tháng.

App Engine có thể đƣợc miêu tả gồm ba phần: môi trƣờng chạy thực, lƣu trữ dữ liệu, các dịch vụ bậc thang.

2.6.2. Môi trường chạy thực

Một ứng dụng App Engine đáp ứng các yêu cầu web. Một yêu cầu web bắt đầu khi một ngƣời dùng trình duyệt, trao đổi với ứng dụng bằng một yêu cầu HTTP, giống nhƣ truy cập một trang web từ một URL. Khi App Engine nhận đƣợc yêu cầu, nó xác định ứng dụng từ tên miền của địa chỉ, hoặc một miền con .app.com (đƣợc cung cấp miễn phí cho mọi ứng dụng) hoặc một miền con của tên miền của khách hàng đăng ký và cài đặt với Google Apps. App Engine chọn một máy chủ từ rất nhiều máy chủ để xử lý yêu cầu, lựa chọn máy chủ nào có khả năng phản hồi nhanh nhất, sau đó gọi ứng dụng với nội dung của yêu cầu HTTP, nhận dữ liệu đáp ứng từ ứng dụng và trả đáp ứng về máy ngƣời dùng.

Một ứng dụng có thể đọc chính các file từ hệ thống file của nó, nhƣng lại không thể ghi vào các file và càng không thể đọc các file của một ứng dụng khác. Một ứng dụng không thể truy cập các tài nguyên mạng của máy chủ

phần cứng mặc dù nó có thể xử lý các vấn đề liên quan đến mạng bằng các dịch vụ.

App Engine có thể đánh giá để tìm ra máy chủ xử lý một yêu cầu để cung cấp phản hồi nhanh nhất. Không có cách nào đảm bảo rằng cùng một máy chủ phần cứng sẽ xử lý hai yêu cầu, ngay cả khi yêu cầu đến từ cùng một máy khách và đến tƣơng đối nhanh.

App Enginec có thể chạy nhiều ứng dụng trên cùng một máy chủ mà hoạt động của các ứng dụng ảnh hƣởng đến nhau. Để hạn chế truy cập vào hệ điều hành, môi trƣờng chạy thực phải giới hạn tổng thời gian, việc sử dụng CPU khi một yêu cầu xảy ra.

Một yêu cầu có tới 30 giây để trả đáp ứng tới máy khách. App Engine phù hợp với các ứng dụng mà đáp ứng nhỏ hơn một giây.

Google App Engine cung cấp hai môi trƣờng chạy thực cho ứng dụng: môi trƣờng Java và môi trƣờng Python. Môi trƣờng chọn tùy thuộc vào ngôn ngữ và các công nghệ liên quan dùng để phát triển ứng dụng.

Môi trƣờng Java chạy các ứng dụng đƣợc triển khai cho Máy ảo Java 6 (JVM). Một ứng dụng có thể đƣợc cài đặt bằng ngôn ngữ lập trình Java hoặc các ngôn ngữ khác cũng biên dịch hoặc chạy trong máy ảo Java nhƣ PHP (sử dụng Quercus), Ruby (sử dụng Jruby), Javascript (sử dụng trình biên dịch Rhino), Scala, Groovy. Ứng dụng truy cập môi trƣờng và các dịch vụ bằng giao diện web, gồm Java servlets và Java Persistence API (JPA). Bất kỳ công nghệ Java nào mà chức năng bị giới hạn bởi sandbox có thể chạy App Engine. App Engine hỗ trợ Google Web Toolkit (GWT), một framework cho các ứng dụng web cho phép lập trình ứng dụng mà không cần cài thêm gì nữa.

Môi trƣờng Python chạy các ứng dụng đƣợc viết bằng ngôn ngữ lập trình Python 2.5 sử dụng phiên bản Cpython. App Engine gọi một ứng dụng Python sử dụng CGI, một tiêu chuẩn giao diện hỗ trợ ứng dụng. Một ứng

dụng có thể sử dụng thƣ viện chuẩn của Python cũng nhƣ API và thƣ viện để truy cập các dịch vụ và mô hình hóa dữ liệu. Nhiều framework ứng dụng web mã nguồn mở Python làm việc với App Engine nhƣ Django, web2py, Pylons.

Môi trƣờng Java và Python sử dụng cùng mô hình máy chủ ứng dụng: một yêu cầu đƣợc chuyển đến một máy chủ ứng dụng, ứng dụng đƣợc khởi động trên máy chủ ứng dụng (nếu cần thiết) và đƣợc gọi để xử lý yêu cầu, tạo ra kết quả, kết quả đƣợc trả về máy khách. Mỗi môi trƣờng chạy một bộ biên dịch của nó (bộ biên dịch JVM hoặc Python).

Việc sử dụng các máy chủ khác nhau cho mỗi yêu cầu có ƣu điểm trong việc co giãn. App Engine giảm nhẹ giá khởi động bằng việc lƣu ứng dụng trong bộ nhớ lâu nhất có thể và sử dụng lại máy chủ một cách thông minh. Khi một máy chủ cần lấy lại tài nguyên, nó khử ứng dụng đƣợc sử dụng gần nhất đi. Tất cả các máy chủ ứng dụng có môi trƣờng chạy (bộ biên dịch JVM hoặc Python) đƣợc tải trƣớc khi yêu cầu đến đƣợc máy chủ, chỉ có ứng dụng tự nó đƣợc tải vào máy chủ mới.

Ứng dụng có thể lợi dụng bộ đệm ứng dụng để giữ dữ liệu trực tiếp trên máy chủ. Vì một ứng dụng có thể bị loại trừ giữa hai yêu cầu (và các ứng dụng lƣu lƣợng thấp thƣờng đƣợc loại trừ), không có gì đảm bảo rằng một yêu cầu của ngƣời dùng sẽ đƣợc một máy chủ xử lý, các biến toàn cục dùng để khởi động tài nguyên cũng nhƣ phân tích các file cấu hình.

Có thể cấu hình máy chủ để sử dụng hệ điều hành hoặc phần cứng nào đó, nhƣng môi trƣờng chạy là một trừu tƣợng hóa mức trên của hệ điều hành, cho phép App Engine quản lý các nguồn tài nguyên, tính toán, xử lý yêu cầu, thay đổi, tải các phân tán mà không gồm ứng dụng. Các tính năng yêu cầu kiến thức về hệ điều hành đƣợc cung cấp bởi các dịch vụ bên ngoài môi trƣờng chạy thực, đƣợc cung cấp hoặc đánh giá bằng lời gọi thƣ viện chuẩn hoặc hạn chế theo cách logic trong định nghĩa của sandbox.

2.6.3. Lưu trữ dữ liệu

Hầu hết các ứng dụng web cần lƣu trữ thông tin trong suốt quá trình xử lý. Cấu hình cho một trang web nhỏ bao gồm một máy chủ cơ sở dữ liệu, một hoặc nhiều máy chủ kết nối đến cơ sở dữ liệu để lƣu và truy vấn dữ liệu. Sử dụng một máy chủ cơ sở dữ liệu trung tâm sẽ giúp cho việc hiển thị dữ liệu dễ dàng hơn, để nhiều ngƣời dùng truy cập nhiều máy chủ web đều thấy cùng một thông tin và là các thông tin mới nhất.

Hầu hết các hệ lƣu trữ dữ liệu cho ứng dụng web trong các thập kỷ trƣớc đều là cơ sở dữ liệu quan hệ, với các bảng gồm các dòng và cột với các chỉ số và các hàm tính toán để thực hiện truy vấn, đặc biệt là các truy vấn kết hợp (join) để xử lý các bản ghi có liên quan đến nhau. Một loại hệ cơ sở dữ liệu khác gồm cây phân cấp lƣu trữ dữ liệu (hệ thống file, cơ sở dữ liệu XML) và các cơ sở dữ liệu đối tƣợng. Mỗi loại cơ sở dữ liệu có ƣu, nhƣợc điểm riêng, phù hợp cho ứng dụng tùy thuộc vào tính chất của dữ liệu và cách dữ liệu đƣợc truy cập.

Lƣu trữ dữ liệu trong App Engine không giống nhƣ cơ sở dữ liệu quan hệ truyền thống, các đối tƣợng dữ liệu (các thực thể) có một kiểu và một tập các thuộc tính. Các truy vấn có thể truy vấn các thực thể theo kiểu nào đó và sắp xếp giá trị của các thuộc tính. Giá trị của các thuộc tính có thể thuộc các kiểu nhƣ: Lớp thuộc tính Giá trị Thứ tự sắp xếp StringProperty str unicode Unicode (str đƣợc coi là ASCII)

ByteStringProperty ByteString Thứ tự byte

BooleanProperty Bool False < True

IntegerProperty int

FloatProperty Float Số học DateTimeProperty

DateProperty TimeProperty

datetime.datetime Theo thứ tự thời gian ListProperty StringListProperty List Sắp xếp tăng dần từ danh sách có ít thành phần nhất; sắp xếp giảm dần từ danh sách có nhiều thành phần nhất ReferenceProperty SelfReferenceProperty db.Key Theo các thành phần (kiểu, ID hoặc tên, loại, ID hoặc tên...)

blobstore.BlobReferenceProperty blobstore.BlobKey thứ tự byte

UserProperty users.User Theo địa chỉ email

(Unicode)

BlobProperty db.Blob Không sắp xếp

đƣợc

TextProperty db.Text Không sắp xếp

đƣợc

CategoryProperty db.Category Unicode

LinkProperty db.Link Unicode

EmailProperty db.Email Unicode

sau đó theo chiều dài

IMProperty db.IM Unicode

PhoneNumberProperty db.PhoneNumber Unicode PostalAddressProperty db.PostalAddress Unicode

RatingProperty db.Rating Số học

App Engine cung cấp hai lựa chọn lƣu trữ dữ liệu khác nhau, phân biệt nhau bởi tính có sẵn và nhất quán, đó là lƣu trữ dữ liệu High Replication và Master/Slave.

Trong lƣu trữ dữ liệu High Replication, dữ liệu đƣợc lƣu trên nhiều trung tâm dữ liệu. High Replication cung cấp tính có sẵn rất cao cho việc đọc và ghi vì dữ liệu đƣợc lƣu đồng bộ trên nhiều trung tâm dữ liệu. Lƣu trữ dữ liệu High Replication là kiểu lƣu trữ dữ liệu duy nhất trong Python 2.7.

Trong lƣu trữ dữ liệu Master/Slave, một trung tâm dữ liệu giữ bản sao chép chính của dữ liệu, dữ liệu đƣợc ghi vào trung tâm dữ liệu chính không đồng bộ với tất cả các trung tâm dữ liệu phụ khác. Chỉ có một trung tâm dữ liệu giữ các bản sao chép chính, nên rất nhất quán cho việc đọc và truy vấn. Master/Slave không hỗ trợ trong Python 2.7.

Các đối tƣợng dữ liệu trong lƣu trữ dữ liệu App Engine đƣợc gọi là các thực thể. Mỗi thực thể có thể có một hoặc nhiều thuộc tính. Thuộc tính có thể là chuỗi, là số nguyên, hoặc thậm chí tham chiếu đến một thực thể khác. Thuộc tính có thể có một hoặc nhiều giá trị. Một thuộc tính có nhiều giá trị có thể có nhiều kiểu. Truy vấn trên thuộc tính có nhiều giá trị kiểm tra xem các giá trị có phù hợp với tiêu chuẩn của truy vấn hay không.

Các thực thể của một kiểu giống nhƣ các dòng trong một bảng, các thuộc tính giống nhƣ các cột. Một thực thể của một kiểu đã cho không bắt buộc phải có cùng thuộc tính với các thực thể khác cùng loại. Một thực thể có thể có

thuộc tính cùng tên với thuộc tính của thực thể khác. Điểm khác biệt khác giữa thực thể và hàng trong bảng là một thực thể có thể có nhiều giá trị cho cùng một thuộc tính.

Mọi thực thể đều có một khóa riêng. Không giống cơ sở dữ liệu quan hệ, khóa không phải là “trƣờng” hay thuộc tính, nhƣng là một khía cạnh độc lập của thực thể. Có thể tìm một thực thể nhanh nếu biết khóa của nó, và truy vấn đƣợc thực hiện trên khóa đó. Khóa của thực thể không thay đổi đƣợc sau khi thực thể đã đƣợc tạo ra.

Lƣu trữ dữ liệu cung cấp một API với các hoạt động đơn giản trên thực thể bao gồm “get”, “put”, “delete”, “query”. Ngƣời dùng có thể sử dụng API bậc thấp để thực thi các giao diện khác hoặc sử dụng trực tiếp trong ứng dụng. Mỗi đối tƣợng dữ liệu trong App Engine (entity) có một hoặc nhiều thuộc tính thuộc nhiều kiểu khác nhau. Mỗi thực thể cũng có một khóa để phân biệt các thực thể với nhau. Khóa đơn giản nhất có loại (kind) và mã thực thể (entity ID). Loại giúp phân chia các thực thể do đó việc truy vấn sẽ dễ dàng hơn.

Lƣu trữ dữ liệu App Engine không yêu cầu tất cả các thực thể thuộc cùng một loại có cùng thuộc tính giống nhau. Ứng dụng có thể xác định và tuân theo mô hình dữ liệu bằng thƣ viện trong SDK hoặc mã ứng dụng.

Mỗi truy vấn dùng một chỉ số, một bảng chứa kết quả của truy vấn theo thứ tự mong muốn. Ứng dụng App Engine định nghĩa các chỉ số trong file cấu hình. Máy chủ ứng dụng web tự động thêm các yêu cầu với file này khi gặp các truy vấn không dựa trên chỉ số. Có thể điều chỉnh chỉ số bằng cách thay đổi file trƣớc khi đƣa ứng dụng lên. Khi các thực thể của ứng dụng bị thay đổi, các chỉ số với kết quả đúng sẽ đƣợc cập nhật. Khi một truy vấn đƣợc thực thi, kết quả đƣợc lấy từ chỉ số tƣơng ứng.

Cơ chế này hỗ trợ nhiều truy vấn và phù hợp với hầu hết các ứng dụng. Tuy nhiên cơ chế này không hỗ trợ một số loại truy vấn trong công nghệ cơ sở dữ liệu nhƣ phép nối (join) và kết tập (aggregate).

Có thể thực hiện nhiều hành động trên một thực thể trong một giao dịch bằng API giao dịch. Có thể thay đổi nhiều thực thể trong một giao dịch bằng nhóm thực thể (entity groups) bằng cách khai báo thực thể đó thuộc về một nhóm thực thể khi tạo thực thể. Với những ứng dụng sử dụng kho dữ liệu theo kiểu Master/Slave, tất các các thực thể đƣợc trả về, đƣợc tạo ra, đƣợc cập nhật hoặc bị xóa trong một giao dịch phải thuộc cùng nhóm thực thể. Với những ứng dụng sử dụng kho dữ liệu theo kiểu High Replication, các thực thể trong một giao dịch có thể thuộc cùng một nhóm thực thể hoặc thuộc các nhóm thực thể khác nhau.

Các nhóm thực thể đƣợc định nghĩa bằng cây quan hệ giữa các thực thể. Để tạo thực thể trong nhóm, cần khai báo thực thể là con của một thực thể khác đã có trong nhóm. Thực thể khác kia sẽ là cha. Một thực thể không có cha là thực thể gốc. Thực thể gốc mà không có con thuộc về nhóm thực thể chỉ có mình thực thể đó. Mỗi thực thể có một đƣờng quan hệ cha – con từ thực thể gốc đến thực thể đó. Đƣờng này là một phần tất yếu của khóa. Một khóa có thể đƣợc biểu diễn bởi loại và mã (ID) hoặc tên khóa.

Các ứng dụng sử dụng kho dữ liệu High Replication có thể thực hiện các giao dịch trên các thực thể của các nhóm thực thể khác nhau. Tính năng này đƣợc gọi là các giao dịch nhóm chéo (cross-group transactions – XG transactions). Giao dịch nhóm chéo có thể đƣợc áp dụng tối đa trên 5 nhóm thực thể. Một giao dịch nhóm chéo thành công miễn là không có các giao dịch đồng thời nào chạm đến bất kỳ một nhóm thực thể nào trong giao dịch.

Với ứng dụng App Engine, dữ liệu đƣợc ghi lại qua 2 pha: commit và apply. Pha commit xảy ra trƣớc, trong pha này, thực thể dữ liệu đƣợc ghi lại

trong log. Pha apply xảy ra sau đó. Pha này bao gồm hai hành động đƣợc thực hiện song song: dữ liệu thực thể đƣợc ghi lại, chỉ số của các hàng của thực thể đƣợc ghi lại.

Khi ứng dụng tạo ra các thực thể mới và cập nhật các chỉ số cũ, lƣu trữ dữ liệu cũng cập nhật các chỉ số tƣơng ứng. Việc này giúp cho truy vấn nhanh (mỗi truy vấn đơn giản là một lần quét bảng) khi có thể nhiều bảng cần đƣợc cập nhật chỉ vì một thay đổi nhỏ. Hiệu suất của một truy vấn theo chỉ số không bị ảnh hƣởng bởi số lƣợng các thực thể trong cơ sở dữ liệu.

Khi một ứng dụng có nhiều máy khách cùng đọc hoặc ghi cùng một dữ liệu đồng thời, đòi hỏi dữ liệu luôn phải ở trong trạng thái thống nhất. Khi một ứng dụng cập nhật các thuộc tính của một thực thể đơn, App Engine đảm bảo rằng một thời điểm nào đó, mọi việc cập nhật thực thể đều thành công hoặc việc cập nhật thực thể không thành công va thực thể giữ nguyên trạng thái nhƣ trƣớc khi cập nhật. Những ngƣời dùng khác không thấy đƣợc bất kỳ thay đổi nào cho đến khi thay đổi thành công.

Nói cách khác, việc cập nhật một thực thể xảy ra trong một giao dịch. Mỗi giao dịch là nguyên tử: giao dịch hoặc thành công, hoặc thất bại mà

Một phần của tài liệu Nền tảng Google App Engine và ứng dụng xây dựng cổng thông tin điện tử trường cao đẳng nghề số 3 (Trang 37)