1. Trang chủ
  2. » Công Nghệ Thông Tin

Xây dựng API theo chuẩn RESTful cho mạng xã hội chia sẻ địa điểm

103 431 3

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 103
Dung lượng 5,17 MB

Nội dung

Khi quyết định xây dựng thư viện lập trình và mạng xã hội chia sẻ địa điểm, tôi mong muốn xây dựng các ứng dụng có thể chạy được trên các nền tảng, hệ điều hành khác nhau, cũng như có

Trang 2

LỜI CAM ĐOAN

Tôi Đào Anh Khoa cam kết luận văn thạc sĩ là công trình nghiên cứu của bản thân tôi dưới sự hướng dẫn của TS Nguyễn Nhật Quang

Các kết quả nêu trong luận văn thạc sĩ là trung thực, không phải là sao chép toàn văn của bất kỳ công trình nào khác

Hà Nội, ngày 22 tháng 09 năm 2014

Tác giả luận văn

Đào Anh Khoa

Xác nhận của giáo viên hướng dẫn về mức độ hoàn thành của luận văn và cho phép bảo vệ:

Hà Nội, ngày 22 tháng 09 năm 2014

Giáo viên hướng dẫn

TS Nguyễn Nhật Quang

Trang 3

MỤC LỤC

MỤC LỤC 1

DANH MỤC CÁC TỪ VIẾT TẮT VÀ THUẬT NGỮ 2

DANH MỤC CÁC BẢNG 2

DANH SÁCH CÁC HÌNH 2

MỞ ĐẦU 5

1 Đặt vấn đề 7

2 Các công nghệ sử dụng 11

2.1 RESTful Web Service 11

2.2 Ruby On Rails 15

2.3 Memcached 16

2.4 Redis 18

2.5 ElastichSearch 20

2.6 Amazon Web Services (AWS) 21

2.7 Google geocoding 23

2.8 Sidekiq 24

3 Phân tích, thiết kế hệ thống 26

3.1 Tổng quan về các chức năng của hệ thống 26

3.1.1 Chức năng quản trị: 26

3.1.2 Các chức năng chính của mạng xã hội 27

3.2 Phân tích, thiết kế hệ thống 31

3.2.1 Khung nhìn theo lược đồ trường hợp sử dụng (Use-case diagram) 31

3.2.2 Khung nhìn theo lược đồ hoạt động (Activity diagram) 34

3.2.3 Khung nhìn theo lược đồ chuỗi hành động (Sequence diagram) 39

3.2.4 Thiết kế cơ sở dữ liệu 71

3.2.5 Sơ đồ các package của hệ thống 72

4 Cài đặt thư viện 73

4.1.1 KdaGem 74

4.1.2 Kcache 75

4.1.3 Mredis 76

5 Cài đặt hệ thống mạng xã hội chia sẻ địa điểm 80

5.1 Kiến trúc hệ thống 80

5.2 Giao diện chương trình của các chức năng chính trong hệ thống 82

6 Kết luận 96

7 Tài liệu tham khảo 97

Trang 4

8 PHỤ LỤC 98

DANH MỤC CÁC TỪ VIẾT TẮT VÀ THUẬT NGỮ Viết tắt Thuật ngữ Ghi chú CSDL Cơ sở dữ liệu AWS Amazon Web Service Dịch vụ đám mây của Amazon S3 Simple Storage Service Dịch vụ lưu trữ đám mây của Amazon MXH Mạng xã hội DANH MỤC CÁC BẢNG Bảng 4.1 Các phương thức trong thư viện KdaGem 75

DANH SÁCH CÁC HÌNH Hình 2.1 Hình minh họa sử dụng các phương thức HTTP trong RESTful 12

Hình 2.2 Thiết kế trạng thái 12

Hình 2.3 Thiết kế phi trạng thái 13

Hình 2.4: Sử dụng Memcached trong đệm dữ liệu khi truy cập cở sở dữ liệu 17

Hình 2.5: Kiến trúc hệ thống khi sử dụng Amazon Cloudfront 23

Hình 3.1 Biều đồ Use-case chức năng quản lý theo hình ảnh 31

Hình 3.2 Biểu đồ Use-case chức năng quản lý theo địa điểm 32

Hình 3.3 Biều đồ Use-case người sử dụng 33

Hình 3.4 Biểu đồ activity của quá trình đăng kí 34

Hình 3.5 Biểu đồ activity quá trình đăng nhập 35

Trang 5

Hình 3.6 Biểu đồ activity đăng ảnh mới 36

Hình 3.7 Biểu đồ activity kiểm tra ảnh có được vào danh sách phô biến không? 38

Hình 3.8 Biểu đồ sequence của tiến trình bình luận về ảnh 39

Hình 3.9 Biểu đồ sequence của tiến trình xóa bình luận về ảnh 41

Hình 3.10 Biểu đồ sequence tiến trình thích ảnh 42

Hình 3.11 Biểu đồ sequence tiến trình thực hiện sưu tập ảnh 44

Hình 3.12 Biểu đồ sequence tiến trình đưa ảnh vào thư mục sưu tập 46

Hình 3.13 Biểu đồ sequence tiến trình xóa ảnh khỏi thư mục sưu tập 47

Hình 3.14 Biểu đồ sequence tiến trình xóa ảnh 48

Hình 3.15 Biểu đồ sequence tiến trình báo cáo sai phạm về ảnh 49

Hình 3.16 Biểu đồ sequence tiến trình tìm kiếm ảnh theo các tiêu chí khác nhau 50

Hình 3.17 Biểu đồ sequence tiến trình lấy danh sách ảnh của người dùng được theo dõi bởi người dùng hiện tại 51

Hình 3.18 Biểu đồ sequence tiến trình lấy danh sách ảnh được sưu tập 52

Hình 3.19 Biểu đồ sequence tiến trình lấy danh sách các ảnh popular (ảnh đạt số point lớn hơn 1 số nhất định trong vòng 3 ngày) 53

Hình 3.20 Biểu đồ sequence tiến trình lấy danh sách các ảnh mới nhất 54

Hình 3.21 Biểu đồ Sequence tìm kiếm ảnh trong phạm vi và được sắp xếp theo thời gian hoặc độ phổ biến 55

Hình 3.22 Biểu đồ Sequence tìm kiếm địa điểm theo từ khóa tên thành phố, tên bang, tên nước, 56

Hình 3.23 Biểu đồ Sequence lấy danh sách ảnh gắn với một địa điểm 57

Hình 3.24 Biểu đồ Sequence lấy ra danh sách địa điểm đẹp (landmark) trong phạm vi nhất định 58

Hình 3.25 Biểu đồ sequence tiến trình gửi đánh giá về địa điểm đẹp (landmark) 59

Hình 3.26 Biểu đồ sequence tiến trình tạo kế hoạch đến địa điểm bằng ảnh 60

Hình 3.27 Biểu đồ sequence tiến trình lấy danh sách kế hoạch đã được tạo bởi người dùng 61

Hình 3.28: Biểu đồ Sequence lấy danh sách các tin tức của user 62

Hình 3.29 Biểu đồ Sequence tìm kiếm bạn bè (theo tên, username, email) 63

Hình 3.30 Biểu đồ sequence tiến trình đăng kí / hủy đăng kí theo dõi người dùng 64

Hình 3.31 Biểu đồ sequence tiến trình lấy danh sách các người dùng theo dõi người dùng hiện tại 65

Hình 3.32 Biểu đồ sequence tiến trình lấy danh sách các người dùng được theo dõi bởi người dùng hiện tại 66

Trang 6

Hình 3.33 Biểu đồ sequence tiến trình lấy thông tin đăng kí nhận thông báo 67

Hình 3.34 Biểu đồ sequence tiến trình chỉnh sửa đăng kí nhận thông báo 68

Hình 3.35 Biểu đồ sequence tiến trình lấy thông tin cá nhân của người dùng 69

Hình 3.36: Biểu đồ sequence tiến trình chỉnh sửa thông tin cá nhân 70

Hình 3.37 Sơ đồ thiết kế cơ sở dữ liệu hệ thống 71

Hình 3.38 Biểu đồ các package của hệ thống 72

Hình 4.1 Danh sách các thư viện xây dựng được trên RubyGems 73

Hình 5.1 Kiến trúc hệ thống 80

Hình 5.2 Của sổ màn hình đăng kí và đăng nhập 82

Hình 5.3 Thanh công cụ của người dùng sau khi đăng nhập 83

Hình 5.4 Cửa sổ hiển thị tin tức thông báo cho người dùng 83

Hình 5.5 Giao diện trang hiển thị dành cho người dùng 84

Hình 5.6 Sơ đồ quá trình đăng ảnh mới 85

Hình 5.7 Giao diện trang cài đặt thông tin cá nhân của người dùng 86

Hình 5.8 Màn hình chi tiết thông tin về ảnh 87

Hình 5.9 Màn hình danh sách ảnh phổ biến 88

Hình 5.10 Màn hình thực hiện sưu tập ảnh 89

Hình 5.11 Màn hình kết quả sau khi thực hiện sưu tập, thích ảnh 89

Hình 5.12 Màn hình danh sách các bộ sưu tập (dạng lưới) 90

Hình 5.13 Màn hình danh sách các bộ sưu tập (dạng bản đồ) 91

Hình 5.14 Màn hình chi tiết thông tin về một bộ sưu tập 91

Hình 5.15 Màn hình tạo mới kế hoạch 92

Hình 5.16 Màn hình chi tiết thông tin về địa điểm 93

Hình 5.17 Màn hình tìm kiếm người dùng 94

Hình 5.18 Màn hình hiển thị ảnh, và địa điểm đẹp dưới dạng bản đồ 94

Hình 5.19 Màn hình tìm kiếm nâng cao ảnh 95

Hình 8.1 Thông tin thư viện KdaGem 98

Hình 8.2 Thông tin thư viện Kcache 99

Hình 8.3 Thông tin thư viện Mredis 100

Trang 7

MỞ ĐẦU

Trong thời đại hiện nay, mạng xã hội đã trở thành một phần rất phổ biến trong cuộc sống Mạng xã hội là nơi mỗi chúng ta có thể chia sẻ cảm xúc, học hỏi, giao lưu, kết bạn, tìm kiếm thông tin, chia sẽ niềm đam mê, sở thích … Facebook hay Twitter được biết đến như 2 mạng xã hội nổi tiếng và phổ biến nhất, bên cạnh đó là rất nhiều các mạng xã hội khác

Khác với các trang mạng xã hội lớn dùng cho nhiều mục đích (multi-purpose social network) như Facebook, Twitter là nơi cho tất cả mọi người chia sẻ về rất nhiều lĩnh vực trong cuộc sống Mạng xã hội tôi được phát triển trong luận văn nàyhướng tới đối tượng người dùng cụ thể là những người đi du lịch cần tìm địa điểm đẹp và những người thích chụp ảnh muốn tìm đến nơi có thể chụp ra những bức ảnh đẹp – một mạng

xã hội chia sẻ địa điểm

Một vấn đề nữa là các tính năng của một mạng xã hội cần được cập nhật liên tục để thu hút người dung nên cần chương trình có tính mềm dẻo và khả năng mở rộng cao Chính vì vậy tôi chọn Ruby on Rails (http://rubyonrails.org) – một ngôn ngữ lập trình ngắn gọn gần với ngôn ngữ tự nhiên cùng cộng đồng phát triển mạnh giúp rút ngắn thời gian, công sức xây dựng chương trình

Khi quyết định xây dựng thư viện lập trình và mạng xã hội chia sẻ địa điểm, tôi mong muốn xây dựng các ứng dụng có thể chạy được trên các nền tảng, hệ điều hành khác nhau, cũng như có thể kết nối với các ứng dụng hoặc các mạng xã hội khác để tiếp cận đến với càng nhiều người dùng càng tốt Chính vì vậy, tôi xây dựng các thư viện lập trình API theo chuẩn RESTful giúp mọi ứng dụng hay hệ thông đều có thể dễ dàng kết nối mà không phụ thuộc vào ngôn ngữ lập trình hay hệ điều hành Ngoài ra, với những điều thu được, những kĩ thuật hữu ích khi xây dựng mạng xã hội, tôi đóng gói các thành thư viện (gems) để chia sẻ cho cộng đồng phát triển Ruby On Rails nói riêng và các nhà lập trình nói chung

Từ những điểm trên, tôi thực hiện luân văn về “Xây dựng thư viện lập trình API theo

Trang 8

chuẩn RESTful cho mạng xã hội chia sẻ địa điểm” Cụ thể, công việc được thực hiện trong luận văn bao gồm việc nghiên cứu các công nghệ cần thiết để thiết kế và cài đặt các thư viện lập trình API theo chuẩn RESTful, cùng với đó thực hiện cài đặt một hệ thống mạng xã hội chia sẻ địa điểm chạy trên nền tảng Web và đóng gói các thư viện (gems) cho cộng đồng lập trình có thể tái sử dụng

Bố cục của luận văn được tổ chức như sau:

1 Đặt vấn đề: khảo sát, đánh giá các thư viện, framework hỗ trợ xây dựng mạng

xã hội hiện có Qua đó cho thấy tính cần thiết của việc thực hiện các công việc trong luận văn

2 Các công nghệ sử dụng: trình bày các đặc điểm chính và các khả năng của các công nghệ được sử dụng để xây dựng mạng xã hội chia sẻ địa điểm

3 Phân tích, thiết kế hệ thống: trình bày tổng quan về các chức năng của mạng xã hội chia sẻ địa điểm, đặc tả các chức năng bằng các khung nhìn theo lược đồ trường hợp sử dụng (Use-case diagram), lược đồ hoạt động (Activity diagram), lược đồ chuỗi hành động (Sequence diagram)

4 Cài đặt thư viện: trình bày mục đích xây dựng và các tính năng của các thư viện thực hiện được

5 Cài đặt hệ thống mạng xã hội chia sẻ địa điểm: trình bày kiến trúc vật lý, giao diện của các chức năng của các chức năng chính của mạng xã hội chia sẻ địa điểm đã được cài đặt

6 Kết luận: kết quả đạt được đối với các công việc thực hiện trong luận văn, những điểm còn hạn chế, hướng phát triển của các công việc đã làm được trong luận văn

Trang 9

1 Đặt vấn đề

Cùng với sự bùng nổ của các mạng xã hội thì các công cụ hỗ trợ giúp xây dựng mạng xã hội cũng ngày một nhiều lên Vậy vấn đề là tại sao ta không sử dụng các công

cụ đó để xây dựng mạng xã hội chia sẻ địa điểm? Có ưu nhược điểm gì ở những công

cụ này? Và tại sao lại tự xây dựng mạng xã hội này bằng Ruby on Rails? Để trả lời các câu hỏi trên tôi đã thử nghiệm và đánh giá một số framework hỗ trợ xây dựng mạng xã hội tiêu biểu hiện có, bao gồm:

- Buddypress (PHP): http://buddypress.org/

- Dolphin (PHP): http://www.boonex.com/dolphin

- Community Engine (Ruby): http://communityengine.org/

Sở dĩ chọn các framework viết bằng PHP và Ruby On Rails để đánh giá vì ta biết rằng

cả 2 ngôn ngữ đều rất phổ biến, có cộng đồng phát triển mạnh, và đều rất thích hợp để xây dựng, phát triển các mô hình web ứng dụng vừa và nhỏ như mạng xã hội được đề cập trong luận văn này Ta sẽ lần lượt đi vào chi tiết các framework này

Buddypress: Như chúng ta biết Wordpress có một cộng đồng phát triển rất lớn mạnh, trong đó nó có rất nhiều các plugin cung cấp rất nhiều các chức năng khác nhau Trong đó có Buddypress - một plugin hỗ trợ làm MXH của Wordpress

Sau khi cài đặt và thử sử dụng Buddypress tôi thấy nó là một plugin hay để xây dựng một MXH với các chức năng cơ bản như kết bạn, đăng bài, bình luận, thích bài đăng, …

Tuy nhiên số lượng các chức năng Buddypress bản thân nó cung cấp không nhiều Nhưng một lợi thế của nó là cộng đồng phát triển wordpress lớn, số lượng plugin rất nhiều nên ta có thể dễ dàng tìm được các plugin khác giúp xây dưng các chức năng mở rộng của MXH mình muốn xây dựng như Address Geocoder giúp tích hợp địa điểm bản đồ vào bài đăng, hoặc ta muốn kết nối đến các dịch vụ cache dữ liệu giúp nâng cao hiệu năng cho hệ thống (như memcached, redis) hay dịch vụ giúp đánh chỉ mục cho

Trang 10

việc tìm kiếm nâng cao (như elasticsearch) đều có các plugin hỗ trợ tương ứng,… Tuy không khó khăn trong việc tích hợp các plugin và chúng đều ở dạng mã nguồn mở nên

có thể tùy biến cao nhưng công việc này cũng rất mất công

Có thể nhận thấy những điểm hạn chế như sau:

- MXH chia sẻ địa điểm ta cần có sự quản lý phân cấp địa điểm (thành phố, bang, nước) nhưng các plugin chỉ dừng lại ở mức trả cho ta ở dạng chuỗi kí tự nên ta phải

xử lý chuỗi này nếu muốn thực hiện phân cấp quản lý

- Trong trường hợp ta cần nâng cao hiệu năng hệ thống, cần sử dụng memcached như các thành phần bộ nhớ đệm Ta có thể tìm được plugin để kết nối memcached nhưng đó chỉ ở kết nối đơn thuần Khi chúng ta cần sử dụng chúng như memcached

để làm bộ nhớ đệm cho các truy vấn SQL, dùng làm bộ nhớ đệm cho các thành phần lặp lại trên view đều không sẵn có

- Việc xây dựng Restul API trong Buddypress thì rất khó khăn, gặp trở ngại vì không được hỗ trợ, ngay cả sử dụng plugin khác thì cũng chưa hoàn chỉnh

- Để tìm kiếm hỗ hợp, sắp xếp phức tạp thì ta chọn sử dụng dịch vụ Elasticsearch với nhiều ưu điểm Có thể tìm được plugin cho phép kết nối elasticsearch nhưng lại hỗ trợ chưa tốt nhất là việc đưa dữ liệu vào Elasticsearch từ CSDL Định nghĩa các bộ phân tích không có hỗ trợ, đánh chỉ mục cho các phương thức gắn với các đối tượng mà không phải là thuộc tính sẵn có trong CSDL cũng không có

 Dolphin: Là một framework bằng PHP giúp xây dựng MXH nhưng mất phí

Khác vói Buddypress chỉ cung cấp các tính năng mạng xã hội cơ bản thì Dolphin cung cấp các chức năng phong phú hơn thông qua số lương khá lớn các module như: quản lý người dùng, post ảnh, video, quản lý theo tag, lọc và sắp xếp các nhóm đối tượng theo các tiêu chí, Thậm chí nó còn cung cấp giao diện quản trị (admin), forum và tích hợp

di động (mobile) Nhưng cũng có thể thấy các nhược điểm của nó là:

- Sử dụng mất phí, và vấn đề tùy biến vì liên quan đến bản quyền Do đó việc phát triển các chức năng mới sẽ không dễ dàng

Trang 11

- Cũng như Buddypress không thấy có hỗ trợ Restful

- Một điểm chung nữa cho PHP framework, không tích hợp sẵn memcached nên như nói ở trên việc sử dụng memcached làm bộ nhớ đệm giúp tăng hiệu năng hệ thống

và giảm tải cho CSDL khá khó khăn

- Tuy cung cấp khá phong phú các chức năng nhưng một số chức năng mong muốn mang tính đặc thù như tạo bộ sưu tập ảnh, quản lý phân cấp địa điểm cũng chưa có sẵn

 Community Engine: Là tập hợp các gem để xây dựng MXH cho nền tảng Ruby

On Rails Cung cấp các khái niệm cơ bản cho MXH như người dùng, bài đăng, hoạt động, …

Không có các chức năng tìm kiếm hỗn hợp, gom nhóm nhưng ta có thể tích hợp ElasticSearch vào Rails qua thư viện tire Hỗ trợ rất tốt cho kết nối cũng như cấu hình các thành phần, định nghĩa bộ phân tích mới hay tạo chỉ mục cho các phương thức riêng của đối tượng

Khác với các PHP framework ở trên thì Rails tích hợp sẵn memcached, hỗ trợ Restful Đó là các điểm mạnh dễ thấy

Community Engine cũng chỉ cung cấp các chức năng hết sức đơn giản, còn các chức năng cần thiết cho MXH ta mong muốn đều cần phải xây dựng từ đầu như tạo bộ sưu tập, lập kế hoạch, thậm chí là đăng ảnh có gắn với thông tin địa điểm và quản lý phân cấp địa điểm

Ngoài ra tuy Rails tích hợp memached như cache mặc định, bản thân memcached

đã được dùng để làm bộ nhớ đệm cho truy vấn SQL và có hỗ trợ cache trên view Tuy nhiên điểm yếu ở đây là cơ chế đọc từng dữ liệu đệm ra một không phải dạng đọc nhiều dữ liệu cùng lúc Với MXH thì kết nối là tất yếu do đó số lượng đối tượng cần được truy vấn hiển thị sẽ không hề nhỏ, nếu đọc từng giá trị một ra từ memcached thì

nó sẽ tạo ra rất nhiều kết nối đến máy chủ memcached => gây tắc nghẽn, quá tải Do đó rất cần cơ chế gom nhóm các khóa đọc nhiều giá trị chỉ với 1 kết Đối với redis,

Trang 12

Rails cũng có các gems nhưng cũng chỉ hỗ trợ mức cơ bản Việc thực hiện cache cho đối tượng phải tự thực hiện Không có cơ chế xử lý ngoại lệ khi gặp sự cố với redis, … Chính vì vậy, tôi xây dựng các thư viện với mục đích cải thiện các tồn tại trên để cộng đồng phát triển Ruby On Rails có thể dễ dàng tái sử dụng

Như vậy việc sử dụng Community Engine không đem lại lợi ích rút ngắn quá trình xây dựng hệ thống mà còn gây bất tiện vì không phải thư viện nào trong nó cũng có ích trong hệ thống, do dư thừa và phải mất công xóa đi

 Tóm lại, để xây dựng một MXH với các tính năng cơ bản thì có thể sử dụng một trong số các framework nêu trên Tuy nhiên, để xây dựng một MXH phục vụ một lĩnh vực cụ thể như MXH chia sẻ địa điểm mà tôi đang xây dựng, thì việc sử dụng các framework này không đáp ứng được yêu cầu bởi các nguyên nhân sau:

- Thiếu nhiều chức năng cần cho hệ thống như không có quản lý đia điểm phân cấp, tạo và quản lý bộ sưu tập ảnh (đơn thuần chỉ có thích, bình luận về ảnh hoặc bài viết), tìm kiếm gom nhóm và sắp xếp, lập kế hoạch với ảnh …

- Thiếu các cơ chế đệm dữ liệu giúp tăng hiệu năng hệ thống (memcached , redis, ), nếu có thì cũng chỉ ở mức đơn giản cần tùy biến nhiều

- Mặt khác dùng các framework này, do có tính đóng gói nên đều sẽ tạo ra sự dư thừa (cả về code và CSDL), để tối ưu ta lại mất công phân tích và loại bỏ

 Với mục tiêu xây dựng các thư viện lập trình API theo chuẩn RESTful cho MXH chia sẻ địa điểm, cùng với khả năng mở rộng cao (để tích hợp các chức năng mới, được phát triển trong tương lai) thì tôi chọn Ruby On Rails Trong đó, tôi có sử dụng một số thư viện sẵn có và cũng tùy biến xây dựng một số thư viện mới để đáp ứng nhu cầu như đã nêu ở trên

Trang 13

2 Các công nghệ sử dụng

2.1 RESTful Web Service

REST là một khái niệm trừu tượng của kiến trúc World Wide Web REST định nghĩa các quy tắc kiến trúc về thiết kế Web services, bỏ qua các chi tiết các thành phần thực hiện và cú pháp giao thức để tập trung vào vai trò của các thành phần, các khó khăn khi tương tác với các thành phần khác (theo Wikipedia) Nếu tính theo số dịch vụ mạng sử dụng, REST đã nổi lên trong vài năm qua như là một mô hình thiết kế dịch vụ chiếm ưu thế Trong thực tế, REST đã có những ảnh hưởng lớn và gần như thay thế SOAP và WSDL vì nó đơn giản và dễ sử dụng hơn rất nhiều Bằng chúng cho thấy điều đó là các công ty hàng đầu về web 2.0 như Facebook, Google, Yahoo, Twitter, Amazon ủng hộ sử dụng REST cho các dịch vụ của họ Ta có thể thấy được các dịch

vụ sử dụng RESTful web service trong thực tế như ElasticSearch, Amazon Simple Storage Service, Twitter, Hay các framework hỗ trợ RESTful như Ruby On Rails,

Restlet (Java), Django (Python),… (Leonard Richardson, Sam Ruby 2007 RESTful

Web Services) Tập trung vào các yếu tố chinh của RESTful để thấy được các ưu điểm

nó mang lại, ta xem xét đến 4 nguyên tắc thiết kế sau của RESTful:

 Sử dụng các phương thức HTTP một cách rõ ràng

Một đặc tính quan trọng của dịch Web service RESTful là sử dụng một cách rõ ràng các phương thức HTTP theo giao thức được xác định bởi RFC 2616 REST yêu cầu các nhà phát triển sử dụng phương thức HTTP một cách rõ ràng theo cách tương thích với giao thức chuẩn Nguyên lý thiết kế của REST thiết lập ánh xạ 1-1 giữa các hành động tạo, đọc, cập nhật và xoá (CRUD) của quá trình vận hành và các phương thức HTTP như sau:

 Phương thức POST: Để tạo một tài nguyên trên máy chủ

 Phương thức GET: Để truy xuất một tài nguyên

 Phương thức PUT: Để thay đổi trạng thái một tài nguyên hoặc để cập nhật nó

Trang 14

 Phương thức DELETE: Để huỷ bỏ hoặc xoá một tài nguyên

Hình 2.1 Hình minh họa sử dụng các phương thức HTTP trong RESTful

Hình 2.2 Thiết kế trạng thái

Trang 15

Hình 2.3 Thiết kế phi trạng thái

Thiết kế phi trạng thái trong RESTful thể hiện như sau:

 Máy chủ: tạo ra các phản hồi mà xác định chúng có thể lưu trữ hoặc không phải để nâng cao hiệu quả bằng cách giảm số lượng yêu cầu đối với các tài nguyên trùng nhau Máy chủ làm được như vậy bằng cách sử dụng HTTP Last - Modified (lần sửa gần nhất) (giá trị ngày) và Cache-Control (bộ điều khiển lưu trữ) trong phần header trả về

 Ứng dụng máy khách: sử dụng phần đầu phản hồi Cache-Control để xác định lưu trữ tài nguyên nội bộ hay không Máy khách cũng đọc phần đầu phản hồi Last-Modified và gửi lại giá trị ngày vào If-Modified-Since (nếu-sửa) để truy vấn máy chủ xem tài nguyên có thay đổi không Nếu mã phản hồi là HTTP 304, điều đó có nghĩa máy khách có thể sử dụng tài nguyên từ vùng sao lưu nội bộ mà không cần gửi yêu cầu GET cho đến khi tài nguyên thay đổi

 Sự hợp tác này giữa ứng dụng máy khách và máy chủ giúp nâng cao hiệu quả bằng cách tiết kiệm băng thông và tối thiểu hoá trạng thái ứng dụng phía máy chủ

 Cấu trúc URls dạng cấu trúc cây thư mục

Các địa chỉ REST đều được xây dựng với mục đích sao cho rõ ràng, có thể đoán được và dễ hiểu đối với người dùng, do vậy cần xây dựng URIs có cấu trúc Loại URI này có thứ bậc, có điểm nguồn tại một đường dẫn đơn, và có nhánh đi ra từ nó là các đường nhỏ tỏa ra từ phần chính của dịch vụ Nó như là một cây với các nhánh chính và nhánh phụ nối với nhau tại các nút Các URIs này được xây dựng với mục tiêu tự nó

Trang 16

đem đến ý nghĩa mà cần ít lý giải thêm, đối với nhà phát triển thì nó giúp chỉ định đến tài nguyên liên quan

Ví dụ 1: đường dẫn để truy cập đến trang của một thành phố trong hệ thống:

http://www.pash.com/locations/cities/{name}

Gốc là /locations (chỉ kiểu địa điểm), có một nút tiếp theo là /cities (chỉ đây là kiểu thành phố) bên dưới nó Phía cuối {name} đơn giản là chuỗi chỉ tên của thành phố muốn xem

Ví dụ 2: phân cấp tài nguyên theo cấu trúc bởi ngày, tháng, năm

http://www.pash.com/discussion/{year}/{day}/{month}/{topic}

 Chuyển đổi JSON và XML hoặc cả hai

Cuối cùng cần nhắc đến là việc trả về dữ liệu cho yêu cầu từ máy khách Các máy khách có thể yêu cầu các nguồn tài nguyên đa dạng như một bản ghi trong một cơ sở

dữ liệu bao gồm một tổng thể giữa tên các cột và các thẻ XML (nơi các giá trị thành phần trong XML bao gồm các giá trị các dòng) hoặc một bản tóm tắt các thuộc tính của những thứ trong mô hình dữ liệu hệ thống dưới dạng JSON RESTful thiết lập quy trình phải làm thế nào với định dạng dữ liệu mà ứng dụng và dịch vụ trao đổi trong quá trình yêu cầu/phản hồi hoặc trong phần thân của HTTP Để máy khách có khả năng yêu cầu loại nội dung cụ thể cho các ứng dụng phù hợp nhất, hãy tận dụng được phần HTTP Accept header sẵn có (giá trị ở đây muốn nhắc đến là MIME-type) Điều đó cho phép máy khách chọn định dạng dữ liệu nào là đúng với chúng và tối thiểu hoá sự kết nối lại giữa dịch vụ và các ứng dụng mà sử dụng nó Các loại định dạng thông thường

Trang 17

2.2 Ruby On Rails

Ruby on Rails được biết đến là một Web framework với ngôn ngữ lập trình là Ruby

và hỗ trợ đầy đủ RESTful web service Như mọi Web framework, nó có chứa nhiều công cụ, thư viện và các tiện ích mở rộng của ngôn ngữ Ruby cho phép lập trình viên tạo phần mềm trên nền web dễ dàng Một điểm nữa là các thư viện và cộng đồng phát triển Ruby on Rails khá mạnh và đa phần là mã nguồn mở, cho phép các lập trình viên

dễ dàng sử dụng và tùy biến theo mục đích Theo các đánh giá của các hà phát triển, Ruby on Rails có thể làm giảm chi phí tạo ra và duy trì phần mềm trên nền web

Dưới đây là một số trong những lý do chính để sử dụng Ruby on Rails cho dự án ứng dụng web:

 Thời gian phát triển nhanh hơn

Ruby on Rails đã được tạo ra với một khái niệm trong tâm trí gọi là "quy ước về cấu hình" Trong một số công nghệ khác, các nhà phát triển cần phải giành thời gian đáng kể để đưa ra quyết định về cách một ứng dụng sẽ được thiết lập (ví dụ, cấu trúc cho các dự án, làm thế nào mã kết nối CSDL, hoặc các thiết lập trong các tập tin cấu hình) Rails đi kèm với những quyết định "mặc định hợp lý", quy ước mà nó làm việc tốt trong phần lớn các ứng dụng Điều đó có nghĩa các nhà phát triển có thể dành phần lớn thời gian vào các vấn đề mà họ đang cố gắng giải quyết trong ứng dụng của họ, không phải là khía cạnh cài đặt thiết lập chung Rails cũng bao gồm một khái niệm được gọi là "không lặp lại chính mình" hay DRY Ý tưởng đằng sau DRY là ta không nên lặp lại mã của chính mình Thay vào đó, ta nên sắp xếp nó trong một cách mà mã cần thiết ở những nơi nhiều có thể được viết một lần, sau đó chia sẻ bất cứ nơi nào cần thiết của nó Điều này giúp tránh được "sao chép / dán mã" và làm cho việc bảo trì, thay đổi dễ dàng hơn

Trang 18

 Thư viện và cộng đồng phát triển mạnh

Thư viện của Ruby được gọi là "gems" nó tương tự như plugin trong WordPress, hay thư viện (lib) trong java nhưng nó dễ dàng hơn cho việc ghép vào chương trình Chỉ cần khai báo và chỉ định phiên bản là có thể sử dụng Đặc biệt tiện lợi trong việc nhiều người phát triển một dự án hay trên nhiều máy khác nhau, khi đó thao tác sẽ đơn giản và rút gọn hơn Ngoài ra cộng đồng phát triển mạnh cùng với việc các gems đều ở dạng mở nên người phát triển không chỉ dễ dàng trong việc tìm kiếm và sử dụng mà còn dễ dàng tùy biến theo mục đích

 Tự động kiểm tra

Vấn đề về thử nghiệm rất quan trọng Khi ta xây dựng từng phần, ta muốn được rằng nó hoạt động đúng Và ta cũng muốn chắc chắn rằng khi ta tiếp tục xây dựng trên tính năng mới, ta không gây ảnh hưởng đến những gì đã làm Đó là những điểm cơ bản

mà kiểm tra tự động cho phép ta làm, bằng cách viết code để kiểm tra chức năng hoặc các phần chức năng Đó là mã thử nghiệm có thể được chạy với một lệnh duy nhất và

có thể nhanh chóng kiểm tra tất cả các trường hợp cho các chức năng của hệ thống để chắc chắn tất cả mọi thứ vẫn hoạt động chính xác Điều này chính xác và đầy đủ hơn nhiều với việc kiểm tra trên giao diện chương trình trên các trình duyệt web

2.3 Memcached

Memcached là phần mềm miễn phí và mã nguồn mở, nó hỗ trợ việc phân tán rất tốt, cho nên ta có thể dễ dàng triển khai với nhiều server memcached phân tán Memcached lưu trữ dựa trên các cặp khóa và giá trị trên bộ nhớ RAM Memcached thường được dùng như một hệ thống lưu trữ bản sao các đối tượng và dữ liệu được truy cập nhiều lần để tăng tốc độc truy xuất Vì Memcached tạo các bộ nhớ đệm dữ liệu và các đối tượng trong bộ nhớ RAM nên nó đảm bảo việc truy cập dữ liệu rất nhanh, mà không phải truy cập vào CSDL hay tài nguyên trên đĩa cứng

Trang 19

(Nguồn: http://cerberusweb.com/book/latest/admin_guide/performance/memcache.html)

Hình 2.4: Sử dụng Memcached trong đệm dữ liệu khi truy cập cở sở dữ liệu

Mặt khác Ruby on Rails tích hợp sẵn memcached như một cache mặc định Việc tải

dữ liệu từ CSDL được mặc định hỗ trợ cache bởi memcached trong Rails Do đó ta không mất thời gian cho việc thực hiện hay cài đặt cho nó

Một tác dụng khác của memached trong hệ thống tôi xây dựng, đó là memcached để thực hiện cache từng phần (cache fragment) cho đối tượng JSON hay phần HTML được dùng chung để giảm thời gian xử lý, tăng tốc độ hệ thống Điều này giúp giảm thời gian tạo dữ liệu, giảm tài nguyên máy chủ cho công việc này bằng cách dùng dữ liệu có sẵn trong bộ nhớ đêm Khác với việc cache toàn bộ trang web hay toàn bộ dữ liệu JSON trả về, ở đây ta chỉ cache fragment một phần Sở dĩ vậy vì cache toàn bộ trang web chỉ thực hiện được với các trang web dùng chung và không bất biến với các người dùng khác nhau, điều này rất ít có trong một mạng xã hội có sự tương tác giữa các đối tượng Ngoài ra theo các tiêu chí tìm kiếm và sắp xếp khác nhau thì dữ liệu trả

về cũng không cố định Do đó ta chỉ có thể thực hiện cache một phần dữ liệu dùng chung bất biến, còn các trạng thái sẽ không bị cache do đó sẽ đảm bảo tính đúng đắn về

Trang 20

trạng thái tương tác với các người dùng khác nhau

Ví dụ: việc thực hiện cache cho API lấy danh sách các ảnh: cache các phần thông tin (url, title, vị trí, tọa độ, …) của từng ảnh - đây là không thay đổi với các người dùng khác nhau Phần thông tin trạng thái như like_status, pin_status, … sẽ không được cache Khi thực hiện tìm kiếm sắp xếp để lọc ra danh sách các ảnh, các đối tượng ảnh được lọc sẽ được lấy thông tin từng đối tượng từ bộ nhớ đệm dựa vào ID của ảnh sau đó hợp nhất dữ liệu JSON trả về

Ngoài ra, memcached còn được sử dụng cache các phần thông tin dùng chung ít thay đổi hoặc chỉ thay đổi trong một khoảng thời gian nhất đinh Như danh sách ảnh phổ biến chỉ được tính toán và cập nhật mới sau mỗi 30 phút do đó ta có thể đưa danh sách ảnh phổ biến vào memcached và lưu trữ trong vòng 30 phút., sau thời gian này sẽ tự động cập nhật lại cho memcached Điều này, giúp giảm tải cho việc truy cập CSDL, đẩy nhanh tốc độ cho trang web có tính quảng bá của hệ thống

2.4 Redis

Redis được biết đến như một NoSQL CSDL Cũng như các NoSQL DB khác (như memcached, AWS SimpleDB, ) , Redis lưu trữ dữ liệu dưới dạng cặp khóa và giá trị (key - value) Mặc dù làm việc với data dạng key-value và lưu trữ trên RAM, Redis vẫn cung cấp thêm cơ chế lưu trữ dữ liệu trên ổ cứng (Tiago Macedo, Fred Oliveira, 2011) Có 2 lý do cho việc này, một là để đảm bảo toàn vẹn dữ liệu khi có sự cố xảy ra (server bị tắt nguồn) cũng như tái tạo lại dữ liệu khi khởi động lại server, hai là để gửi

dữ liệu đến các slave server, phục vụ cho tính năng replication Redis cung cấp 2 phương thức chính cho việc sao lưu dữ liệu ra ổ cứng, đó là RDB và AOF

- RDB thực hiện tạo và sao lưu snapshot của DB vào ổ cứng sau mỗi khoảng thời gian nhất định

- AOF lưu lại tất cả các thao tác write mà server nhận được, các thao tác này sẽ được

Trang 21

chạy lại khi restart server hoặc tái thiết lập lại dữ liệu(dataset) ban đầu

Một ưu điểm khác của Redis so với Memcached là tuy cùng lưu dữ liệu dưới dạng key-value nhưng kiểu dữ liệu của memcached bị hạn chế không đa dạng như Redis (gồm nhiều kiểu khác nhau như STRING, SET, HASH, LIST, ZSET, ) Do đó ta sử dụng Redis để lưu trữ các dữ liệu cần truy cập thay đổi nhiều như số đếm, trạng thái, để giảm tái cho CSDL chính (Postgres)

Ví dụ: trong mạng xã hội chia sẻ địa điểm, khi một người dùng thực hiện thích (like) 1 ảnh, ngoài việc ghi nhận sự kiện đó thì trạng thái thích của người dùng đó với ảnh, số lượt thích của ảnh đó cũng cần được cập nhật, không kể đến các dữ liệu liên quan như điểm ảnh để tính độ phô biến, số thích của người dùng, Nếu tất cả số đếm, trạng thái trên đều được lưu trữ trên CSDL (CSDL) thì một thao tác thích ảnh kéo theo rất nhiều lần truy cập đến CSDL Vậy làm thế nào để giảm tải cho CSDL? Đó là Redis, ta dùng Redis để lưu trữ số đếm và trạng thái, do cập nhật trên RAM nên việc này thực hiện rất nhanh (việc ghi dữ liệu ra ổ cúng sẽ được Redis ghi nhận thực hiện sau) Không chỉ thao tác ghi dữ liệu, mà khi lấy dữ liệu ra việc truy suất dữ liệu từ Redis trên bộ nhớ RAM cũng nhanh hơn rất nhiều so với việc truy cập CDSL

Một ví dụ khác, ảnh trong hệ thống luôn cần gắn với địa điểm, nhưng địa điểm được phân cấp từ thành phố - bang - nước => khi lấy thông tin địa điểm của ảnh ta phải truy vấn thêm đến 3 bảng trong CSDL Redis sẽ giúp giải quyết vấn đề này Ta sẽ tạo phương thức địa điểm cho mỗi ảnh, nó sẽ được lưu trên Redis Thông tin địa điểm sẽ được cập nhật nếu người dùng thay đổi vị trí ảnh Như vậy thay vì phải truy vấn đến 3 bảng trong CSDL thì ta chỉ cần lấy dữ liệu ra từ Redis đơn giản

Cuối cùng, nhờ vào kiểu dữ liệu đa dạng của Redis ta còn xây dựng được cơ chế gợi

ý từ khóa để tìm kiếm sắp xếp theo độ phổ biến Mà trong luận văn tôi đã đóng gói thành một thư viện để tái sử dụng trong cộng đồng phát triển Ruby on Rails

Trang 22

2.5 ElastichSearch

Elasticsearch là một máy chủ tìm kiếm dựa trên Lucene Elasticsearch được phát triển bằng Java và được phát hành dưới dạng mã nguồn mở theo các điều khoản của Giấy phép Apache Nó cung cấp rất nhiều tính năng mạnh mẽ, một số điểm nổi bật như:

- Distributed: phân tán dữ liệu, cho phép phát triển từ quy mô nhỏ đến mức doanh nghiệp lớn Khi mở rộng quy mô, elasticsearch cùng với khả năng phân tán, chỉ việc thêm các nút và để cho các cluster tận dụng khả năng mở rộng phần cứng

- Full-text search: Elasticsearch sử dụng Lucene để cung cấp các khả năng tìm kiếm toàn văn bản mạnh mẽ Ngoài ra, tìm kiếm đi kèm với hỗ trợ đa ngôn ngữ, ngôn ngữ truy vấn mạnh mẽ, hỗ trợ định vị địa lý

- Multi-Tenancy: Một cluster có thể lưu trữ nhiều chỉ số có thể được truy vấn độc lập hoặc theo nhóm Việ sử dụng bí danh (alias) cho phép minh bạch hóa dễ hiểu hơn trong tìm kiếm và xem kết quả tìm kiếm

- RESTful API: việc kết nối truy vấn đến Elasticsearch từ bất kì ngôn ngữ lập trình nào đều dễ dàng và thuận tiện qua HTTP

Trong hệ thống của tôi, elasticsearch với những tính năng của nó giúp giải quyết nhiều bài toán tìm kiếm quan trọng gồm:

- Tìm kiếm ảnh trong phạm vi nhất định: Elasticsearch cung cấp bộ phân tích geo_point cho phép lưu trữ thông tin về tọa độ của đối tượng Cùng với cơ chế tìm kiếm Geo Distance Filter, Elasticsearch cho phép tìm ra các đối tượng nằm trong một phạm vi (tính theo km, dặm) từ một tọa độ nhất định

- Cung cấp khả năng tìm kiếm và sắp xếp nâng cao: cho phép tìm kiếm ảnh thông qua nhiều trường thông tin khác nhau như tag, chủ đề, tên địa điểm, tên người sở hữu, thời gian đăng ảnh, số lượt thích,

- Gom nhóm và sàng lọc dữ liệu (Facet search): sau khi tìm kiếm ảnh bằng từ khóa,

Trang 23

một nhu cầu khác là người dùng có thể xem kết quả gom nhóm dữ liệu (bao nhiêu ảnh trong thành phố A, bao nhiêu ảnh trong nước B, bao nhiêu ảnh có tag C ) Qua việc gom nhóm dữ liệu, người dùng có thể sàng lọc dữ liệu qua các nhóm và đưa ra được danh sách kết quả theo mong muốn Elasticsearch mặc định cung cấp tính năng này

Một điều nữa là việc cập nhật dữ liệu từ các đối tượng vào Elasticsearch cũng rất dễ dàng thông qua các RESTful API được xây dựng sẵn Đặc biệt với Rails, thư viện tire cho phép kết nối giữa Elasticsearch với từng lớp đối tượng trong hệ thống qua một giao diện lập trình đơn giản

Cuối cùng là khả năng tùy biến và định nghĩa mới các bộ phân tích khiến elasticsearch càng trở nên mạnh mẽ và hữu ích khi ta phải đưa ra các tiêu chí tìm kiếm mang tính riêng biệt (như chỉ tìm kiếm người dùng qua tên đăng nhập bởi từ khóa chứa

từ 3-8 kí tự)

=> Có thể nói elasticsearch đã giúp ta giải quyết bài toán tìm kiếm và lọc dữ liệu trong

hệ thống một cách chính xác và đầy đủ

2.6 Amazon Web Services (AWS)

Với mạng xã hội có tính chất kết nối toàn cầu thì việc đặt máy chủ và cung cấp khả năng kết nối đến hệ thống một cách tối ưu từ mọi vị trí là một điều quan trong hàng đầu Lưu trữ ảnh và truy cập ảnh trong mạng xã hội ảnh cũng rất quan trọng Người dùng sẽ không dùng một hệ thống mà nó chạy quá chậm hay phải đợi quá lâu để chỉ gửi yêu cầu lên máy chủ Một điểm nữa là ta không có hoặc khó có thể có kinh phí để xây dựng một hệ thống lớn để đáp ứng nhu cầu đó Rất may hiện nay các dịch vụ đám mây hình thành và phát triển mạnh cung cấp cho ta những dịch vụ tốt với chi phí rất vừa phải Một trong những dịch vụ đám mây tốt nhất và ra đời sớm nhất đó là dịch vụ đám mây của Amazon - Amazon Web Service (AWS)

Trang 24

Ngoài việc cung cấp và cho thuê máy chủ (Elastic computing with Amazon - EC2) thì AWS còn cung cấp dịch vụ lưu trữ (Amazon Simple Storage Service - S3) và truy cập thông qua Amazon Cloudfront

Amazon Simple Storage Service (S3) cung cấp các giao diện dịch vụ Web cho việc lưu trữ và khôi phục dữ liệu Dữ liệu được cho ở bất kỳ loại nào và có thể được lưu trữ

và truy cập đến từ bất kỳ vị trí nào thông qua Internet Ta có thể lưu trữ không giới hạn một lượng lớn các đối tượng trong S3 với kích thước của mỗi đối tượng trong khoảng

từ 1 byte tới 5 GB Ta có thể chọn vị trí lưu trữ cho các đối tượng khi tạo ra buckets -

tương tự như khái niệm của thư mục Ta cũng xác lập được phân quyền truy cập hay tác động đến vùng lưu trữ Việc truy cập dữ liệu rất đơn giản qua HTTP Ưu điểm của S3 là độ an toàn cao, ổn định, dễ sử dụng và nhất là chi phí rất hợp lý Thêm nữa, việc kết nối và sử dụng S3 API qua HTTP và HTTPS (được bảo mật bằng việc sử dụng mã khóa) cũng rất dễ dàng và không quan trọng ngôn ngữ lập trình nào Do đó tôi quyết định dùng S3 để lưu trữ ảnh cho hệ thống

S3 đem lại rất nhiều tiện lợi và ưu điểm nhưng vẫn có một vấn đề đó là việc truy cập trải rộng trên toàn thế giới Do vị trí đặt lưu trữ là cố định nên không thể đảm bảo việc truy cập dữ liệu (ở đây là ảnh) đến từ khắp nơi có tốc độ tốt Hơn nữa việc truy cập đến cùng một điểm liệu có khiến tắc nghẽn Điều này được giải quyết khi ta sửdụng thêm dịch vụ Amazon Cloudfront Dịch vụ này cho phép ta truy cập đến các dữ liệu S3 thông qua hệ thống mạng lưới các máy chủ đặt khắp toàn cầu Tại mỗi máy chủ khi dữ liệu S3 được truy cập, nó sẽ kiểm tra dữ liệu đã có sẵn chưa, nếu chưa có sẽ truy cập đến S3 để lấy dữ liệu, ghi lại (để lần yêu cầu tới sẽ không cần truy cập đến S3 nữa) rồi trả về Hệ thống này như hệ thống đệm cho phép ra tăng tốc độ truy cập dữ liệu nhanh

và hiệu quả Thông thường với các ảnh khác nhau sẽ tạo ra một định danh khác nhau khi lưu trữ do đó việc đệm bộ nhớ này không ảnh hưởng gì đến hệ thống

Trang 25

(Nguồn:

http://docs.aws.amazon.com/AmazonCloudFront/2012-03-15/DeveloperGuide/ArchitecturalOverview.html)

Hình 2.5: Kiến trúc hệ thống khi sử dụng Amazon Cloudfront

Như vậy, Amazon Web Services không chỉ giúp ta giải quyết vấn đề thuê máy chủ mà còn giúp ta quản lý, lưu trữ cũng như truy cập ảnh một cách hiệu quả với chi phí hợp

Trang 26

một quốc gia hay vùng lãnh thổ nhất định) Một ưu điểm nữa, Google geocoding ngoài cung cấp gói mất phí (cho phép 100000 requests / ngày) thì còn cung cấp gói miễn phí (2500 requests / ngày), điều này là vô cùng hữu ích đối với cộng đồng phát triển phần mềm

Ngoài ra, việc kết nối và sử dụng dịch vụ Google Geocoding rất đơn giản thông qua các Google Geocoding API Google Geocoding API cung cấp kết nối đến dịch vụ qua kết nối HTTP rất đơn giản và không phụ thuộc vào ngôn ngữ lập trình Mẫu kết nối và các tham số được miêu tả đầy đủ và chi tiết cùng với tài liệu hướng dẫn sử dụng tại https://developers.google.com/maps/documentation/geocoding/#Geocoding

2.8 Sidekiq

Trong mạng xã hội, các quan hệ và kết nối giữa các lớp đối tượng có rất nhiều Vì vậy mỗi hành động của một đối tượng đều sinh ra các phát sinh tác động đến các đối tượng khác

Ví dụ một người dùng thích ảnh của một người dùng khác Ngoài thao tác ghi lại sự kiện thích ảnh đó thì còn rất nhiều công việc khác liên quan gồm:

- Tạo mới tin tức về sự kiện (feed) cho người sở hữu ảnh;

- Gửi email hoặc push notification (nếu có) đến người sở hữu ảnh;

- Cập nhật số lượng thích của ảnh, cập nhật điểm của ảnh xét xem ảnh đã đạt tiêu chuẩn để vào danh sách ảnh phổ biến (popular)

Nếu tất cả các sự kiện đều xử lý đồng thời, khi đó người dùng cần phải mất nhiều thời gian để hoàn thành một sự kiện Điều đó là không cần thiết bởi một số công việc không cần thiết phải thực hiện ngay lúc đó mà có thể xử lý sau đó một khoảng thời gian Do đó ta cần xử lý bất đồng bộ và cần đẩy một số công việc vào tiến trình ngầm để thực hiện sau Điều này không chỉ rút ngắn thời gian đợi cho người dùng khi thực hiện một

sự kiện mà còn giúp giảm tại hệ thống khi có thể phân tách các công việc ra các luồng khác nhau thậm chí các máy khác nhau Ngoài ra khi các sự kiện được xử lý nhanh

Trang 27

chóng còn giúp tăng khả năng xử lý và tiếp nhận yêu cầu của hệ thống Do đó việc xử dụng tiến trình ngầm trong mỗi hệ thống mạng xã hội là rất cần thiết

Hiện nay, hầu hết các ngôn ngữ đều cung cấp khả năng tạo và quản lý tiến trình ngầm Trong Ruby on Rails cũng cung cấp khả năng đó nhưng để đơn giản trong quản

lý ta có thể sử dụng Sidekiq Sidekiq cung cấp khả năng quản lý các tiền trình ngầm, cho phép tạo các tiến trình có độ trễ cũng như các tiền trình lặp Việc thực hiện kết nối với Rail cũng rất đơn giản bởi thư viện Sidekiq dưới dạng mã nguồn mở Ngoài ra, Sidekiq còn cung cấp giao diện web cho người quản trị dễ dàng quản lý và theo dõi các tiến trình cũng như khả năng dừng hoặc hủy các tiến trình không mong muốn

Trang 28

3 Phân tích, thiết kế hệ thống

3.1 Tổng quan về các chức năng của hệ thống

3.1.1 Chức năng quản trị:

Yêu cầu tài khoản có quyền hạn quản trị và giao diện chương trình riêng

 Quản trị người dùng:

- Xem, tìm kiếm người dùng Lọc danh sách người dùng theo các tiêu chí quản tri

- Gửi mail cảnh báo, hoặc khóa tài khoản người dùng vi phạm quy định

- Thiết lập người dùng tích cực gợi ý cho các user mới đăng kí hệ thống theo dõi (recommend users)

 Quản trị ảnh :

- Xem, tìm kiếm ảnh, xóa ảnh vi phạm (ảnh nội dung không phù hợp, ảnh spam, ảnh xâm phạm bản quyền, …)

- Lọc danh sách ảnh theo các tiêu chí quản tri

- Chọn, thiết lập ảnh đẹp trong tuần, tháng, năm…

- Xem, xủ lý các báo cáo về hình ảnh Nếu ảnh vi phạm (sai địa điểm, sai nội dung, spam, …) có thể thực hiện ẩn và thông báo đến người dùng sở hữu ảnh đó chỉnh sửa lại các thông tin không chính xác

 Quản trị địa điểm:

- Tạo mới và quản lý danh sách các địa điểm đẹp, danh lam thắng cảnh (landmark)

- Chỉnh sửa, xóa, thêm mới các địa điểm (thành phố, bang, nước)

Trang 29

3.1.2 Các chức năng chính của mạng xã hội

Về việc phân quyền sẽ chia làm 2 nhóm chức năng:

1 Các chức năng được mở, không yêu cầu đăng nhập : xem danh sách ảnh phổ biến, xem danh sách ảnh mới, xem thông tin cơ bản của người dùng, tìm kiếm ảnh, …

2 Các chức năng yêu cầu đăng nhập và có kiểm tra quyền hạn: Chỉ người dùng sở

hữu ảnh mới được xóa, sửa nội dung ảnh, bình luận của ảnh, xem thông tin bộ

sưu tập, các kế hoạch

Sau đây là khái quát các chức năng chính:

3.1.2.1 Người dùng - User:

 Đăng kí tài khoản (Sign up)

 Đăng nhập hệ thống (Login)

 Lấy lại mật khẩu nếu quên qua email

 Xem, chỉnh sửa thông tin hồ sơ cá nhân (Edit profile)

 Tìm kiếm người dùng khác thông qua tên đăng nhập (username), họ tên (firstname, lastname)

 Đưa vào vòng kết nối (follow) người dùng khác

 Xem danh sách người dùng theo dõi mình (follower) và người dùng mình theo dõi (following users)

 User có thể đăng kí nhận thông báo (notification) cho các trường hợp: người dùng được follow, ảnh được thích (like), bình luận (comment), cho vào bộ sưu tập (collect), …

 User có thể xem danh sách các tin (feed) liên quan đến bản thân (thông tin người dùng follow mình, ảnh được thích (like), bình luận (comment), cho vào bộ sưu tập (collect),…)

Trang 30

 Gợi ý danh sách người dung để người dung mới tham gia có thể theo dõi, đưa vào

vòng kết nối

3.1.2.2 Ảnh - Photo:

 Tạo ảnh mới gắn với tag, chủ đề (title), bắt buộc gắn với địa điểm (kinh độ, vĩ độ) Địa điểm chính xác của ảnh sẽ được hệ thống tự động tạo thông qua Geocoding với kinh độ vĩ độ được đưa lên Ngoài địa điểm chính xác của ảnh, người dùng có thể gắn ảnh với một trong các địa điểm đẹp được tạo sẵn bởi ban quản trị (nếu ở gần khu vực của địa điểm đó, bán kính 10km) hoặc người dùng tự tạo để chia sẻ

 Cho phép thích thích (like), bình luận (comment),

 Tạo các bộ sưu tập và đưa ảnh vào các bộ sưu tập (collect)

 Xem và quản lý bộ sưu tập (thêm, bớt ảnh vào bộ sưu tập)

 Người dùng có thể báo cáo về ảnh không hơp lệ, ảnh sai vị trí, ảnh có nội dung không phù hợp, …

 Xóa ảnh của bản thân

 Xóa bình luận về ảnh được viết bởi người dùng đó

Cho phép chia sẻ ảnh lên các mạng xã hội khác (facebook)

3.1.2.3 Địa điểm - Location:

 Thông qua kinh độ, vĩ độ gửi lên, sử dụng Geocoding để tìm ra địa điểm chụp ảnh, sau đó tạo và gắn với ảnh thông tin địa điểm tương ứng (Spot) Người dùng có thể tạo các địa điểm đẹp, danh lam thắng cảnh (landmark ) muốn chia sẻ (đã nhắc đến

ở phần tạo ảnh mới)

 Địa điểm được phân cấp quản lý: từ tên địa điểm (Spot) – tên thành phố (city) – tên bang (state) – tên nước (country)

Trang 31

 Có 1 lượng nhất định các danh lam thắng cảnh trên thế giới (landmark) được tạo sẵn trong cơ sở dữ liệu (lấy từ http://www.lonelyplanet.com/) để người dùng lựa chọn gắn với hình ảnh mình post lên

 Người dùng có thể đánh giá nhận xét về các địa điểm (landmark) có sẵn hoặc do

người dùng khác chia sẻ

 Lên kế hoạch đến địa điểm dựa trên thông tin của ảnh

 Xem danh sách và nội dung các kế hoạch đã được lập của mình

3.1.2.4 Tìm kiếm và gợi ý ảnh địa điểm phù hợp:

 Gợi ý ảnh phù hợp với người dùng:

- Ảnh mới nhất: danh sách các ảnh được tải lên hệ thống sắp xếp theo thời gian từ mới đến cũ

- Ảnh phổ biến (popular): các ảnh được thích (like), bình luận (comment), sưu tập (collect) đến mức nhất định (con số này có thể được thay đổi bởi người quản trị

hệ thống) sẽ được đưa vào danh sách ảnh phổ biến

- Ảnh được lựa chọn: ảnh được nhóm quản trị xem xét chọn lọc và đánh dấu ảnh đẹp của ngày, của tuần, của tháng,

- Hiển thị danh sách ảnh của các người dùng đưa vào vòng kết nối (People I follow)

 Gợi ý ảnh gắn với các địa điểm:

- Ảnh được tạo gắn với địa điểm: người dùng lựa chọn theo mong muốn một trong hai kiểu sắp xếp theo độ phổ biến (được thích (like), bình luận (comment), sưu tập (collect) nhiều) hoặc được sắp xếp theo thời gian

 Gợi ý địa điểm phù hợp với người dùng:

Trang 32

- Dựa vào vị trí hiện tại của người dùng đưa ra danh sách các địa điểm phù hợp theo các tiêu chí khoảng cách gần nhất, được quan tâm nhiều nhât (nhiều ảnh gắn với nó)

- Danh sách các địa điểm gắn với danh sách ảnh được gợi ý

Tìm kiếm:

- Tìm kiếm địa điểm theo phạm vi (nearby): tìm kiếm theo phạm vi từ vị trí hiện tại (hoặc vị trí lựa chọn) bán kính ? km

- Tìm kiếm ảnh trong phạm vi khoảng cách nhất định

- Tìm kiếm ảnh nâng cao: tìm kiếm thông qua tên tag, tên chủ đề (title) ảnh, tên thành phố (city), tên bang (state), tên nước (country) …, có thể kết hợp với khoảng cách

- Tìm kiếm địa điểm bởi tên thành phố (city), tên bang (state), tên nước (country)

- Tìm kiếm nâng cao địa điểm: tìm kiếm thông qua tên kết hợp với khoảng cách

- Lọc kết quả sau khi tìm kiếm theo các tiêu chí (facet filter)

- Kết quả tìm kiếm được sắp xếp kết quả theo các tiêu chí người dùng có thể lựa chọn gồm:

 Độ phổ biến (popular) (số lượng yêu thích, bình luận, sưu tập)

 Khoảng cách với vị trí hiện tại của người dùng (nearby)

 Thời gian từ mới đến cũ (time)

Trang 34

 Các chức năng chính về địa điểm:

Hình 3.2 Biểu đồ Use-case chức năng quản lý theo địa điểm

Trang 35

 Các chức năng chính người dùng:

Hình 3.3 Biều đồ Use-case người sử dụng

Trang 36

3.2.2 Khung nhìn theo lược đồ hoạt động (Activity diagram)

 Đăng kí tài khoản mới:

Hình 3.4 Biểu đồ activity của quá trình đăng kí

Trang 37

 Đăng nhập:

Hình 3.5 Biểu đồ activity quá trình đăng nhập

Trang 38

 Quá trình xử lý khi đăng ảnh mới:

Hình 3.6 Biểu đồ activity đăng ảnh mới

 Kiểm tra thông tin về ảnh gửi lên trong đó bắt buộc phải có thông tin về địa điểm (kinh độ, vĩ độ) không Nếu không có trả về thất bại Nếu có, thực hiện quá trình tạo ảnh mới

 Lưu các thông tin cơ bản của ảnh vào CSDL nhưng để cờ status = 1, thể hiện

Trang 39

ảnh vẫn đang trong quá trình xử lý Sau đó trả về thành công

 Thực hiện tạo và xử lý các tiền trình ngầm sau khi lưu thông tin ảnh vào CSDL (các tiến trình ngầm này nếu xử lý thất bại sẽ được đưa vào hàng đợi của Sidekiq để xử lý lại) Gồm 2 tiến trình sau:

1 Tải ảnh lên S3: thực hiện xử lý ảnh, tạo các loại ảnh với các kích thước khác nhau từ ảnh gốc (ảnh vừa, nhỏ cho web, cho mobile) Sau đó, tải ảnh và lưu trữ lên S3, lấy thông tin ImageID ảnh từ S3 Cập nhật thông tin ảnh vào CSDL gồm ImageID và chuyển cờ status = 5 (đã xử lý xong việc lưu trữ ảnh)

2 Chuyển đổi và lưu thông tin cụ thể về địa điểm của ảnh: thực hiện xử lý chuyển đổi bằng cách sử dụng Google Gecoding Lưu thông tin nhận được vào cơ sở dữ liệu (có phân cấp qua các lớp nước – country, bang – state, thành phố - city) Sau đó cập nhật thông tin địa điểm cho ảnh đó trong CSDL thông qua PhotoModel

 Chỉ khi cả 2 tiến trình trên thực hiện thành công thì ảnh đó mới có thể hiện thị trên hệ thống Nếu một trong hai chưa xong, ảnh sẽ hiện thị trên trang quản lý ảnh của người dùng với thông báo đang xử lý

Trang 40

 Kiểm tra tính phổ biến của ảnh:

Hình 3.7 Biểu đồ activity kiểm tra ảnh có được vào danh sách phô biến không?

 Quá trình thực hiện sau mỗi lần ảnh được thích, bình luận hoặc sưu tập

 Đầu tiên, kiểm tra ảnh đã trong danh sách phổ biến chưa? Nếu chưa nằm trong danh sách, thực hiện kiểm tra thời gian đăng ảnh có trong vòng 3 ngày?, ảnh đủ điểm để vào danh sách phổ biến không? Nếu ảnh đạt các yêu cầu trên, thực hiện đưa ảnh vào danh sách phổ biến thông qua PopularPhotoModel

 Kiểm tra người dùng đăng ảnh có đăng kí nhận thông báo không Nếu có tạo tiền trình ngầm trong sidekiq để thực hiện gửi thông báo đến người sở hữu ảnh

Ngày đăng: 25/07/2017, 21:57

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w