SlideShare a Scribd company logo
1 of 54
Download to read offline
Kinh nghiệm triển khai Microservices
tại Sapo.vn
Nguyễn Minh Khôi
CTO DKT Technology
dkt.com.vn
Agenda
• Giới thiệu về Sapo
• Kiến trúc Microservices
• Bài toán nghiệp vụ của Sapo
2
Giới thiệu về Sapo
3
4
5
Kiến trúc Microservices
6
Programming Languages
Frameworks & Libraries
Web ServersDatabases
Message Queues
|S3, EC2, Route53
Cloud Services
Others
Sapo Tech Stack
7
Sapo Microservices Components
• Dựa trên Spring Boot & Netflix OSS
• Service Discovery: Eureka (Server), Ribbon (Client)
• API Gateway: Zuul
• Centralized Configuration: Spring Cloud Config
• API Security: Spring Security & Spring Security OAuth
• REST API: Spring Boot
• Job Service: Kafka & Spring Boot
8
Sapo Microservices Architecture
9
Jobs Services
Nginx
Backend
(.NET MVC)
API
Gateway
(Zuul)
OAuth Server
(Spring OAuth)
Browser
3rd
Apps
Kafka
Eureka
Server
Redis
Session
Application
Services
(Spring Boot)
Config Server
Job Services
Webhooks
Service
RabbitMQ
Mobile
app
Routing & Service Discovery
10
11
/admin/orders.json
Routing Request
???
???
Request trong hệ thống Microservices
• Service chạy trên nhiều máy
chủ, ở nhiều port khác nhau
• Các service có thể bật, tắt,
bổ sung bất cứ lúc nào
→ Làm sao để biết service ở
đâu để gọi?
12
Service Discovery - Eureka
• Mỗi 1 service được định danh bằng
serviceId
• Service sử dụng Eureka Client để tương
tác với Eureka Server:
• Register: đăng ký mới (serviceId, host,
port)
• Renew: sử dụng heartbeats định kỳ đăng
ký lại để biết service còn hoạt động
• Get Registry: trả về danh sách host:port
của các service theo serviceId
13
Request vào hệ
thống Microservices
• Kết nối vào hệ thống trở nên
phức tạp do phải biết
serviceId, phải kết nối đến
Service Discovery
• Nginx không biết được sự thay
đổi của các service để gọi &
cân tải
→ Làm sao để đơn giản hóa việc
gọi vào các microservices?
14
API Gateway - Zuul
• Địa chỉ truy xuất duy nhất để gọi vào các microservices
• Zuul là edge service -> không dùng để các microservices gọi lẫn nhau
• Zuul sử dụng Ribbon để gọi tới các service
• Eureka Client
• Client Load Balancer
• Caching
• ZuulFilter: tiền xử lý request trước khi gọi sang các service
15
API Gateway & Service Discovery
16
Get Registry
order
10.0.0.1:8080
10.0.0.2:8081
10.0.0.3:8082
Centralized Configuration
17
Centralized Configuration
18
Vấn đề:
- Cấu hình phân tán, khó
kiểm soát
- Các service có 1 số cấu
hình chung, thay đổi là
phải đổi hàng loạt
- Reload config khi đang
chạy
Centralized Configuration
19
Spring Cloud Config
• Thông tin file cấu hình được lưu trong git hoặc file vật lý
• Tên file: {serviceId}.yml
• Nhiều môi trường: dev, test, stage, live...
• Kế thừa từ application.yml: mọi service đều lấy cấu hình
chung
• File bootstrap.yml: cấu hình serviceId, config server, môi
trường
• Reload Config: HTTP GET [service-host:port]/refresh
• Spring Cloud Bus – auto reload
20
Authentication & Authorization
21
Đối tượng yêu cầu truy cập
• 1st Party: Backend, quản trị hệ thống...: toàn quyền truy xuất mọi
website
• 3rd Party: ứng dụng của các nhà phát triển cung cấp thêm tính năng
cho chủ cửa hàng: chủ cửa hàng cấp quyền truy xuất từng tài nguyên
• Mobile app: đăng nhập để lấy token truy xuất, quyền theo tài khoản
đăng nhập
→Cần 1 phương thức xác thực & kiểm tra quyền linh hoạt -> OAuth2 +
Spring Security
22
23
Ghi chú:
• 3rd Apps: xác thực OAuth qua
Access Token
• Sapo Mobile App: Client Credential
• Backend: Client Credential, Session
Credential (Share session giữa
Backend và OAuth Server).
• 3rd App: có quyền trên mọi cửa
hàng , Sapo Mobile App +
Backend: Có quyền trên cửa hàng
được cấu hình
CI/CD với Docker Swarm
& Jenkins
24
1 Dockerfile cho mọi service
FROM frolvlad/alpine-oraclejdk8:slim
ADD lib lib
ADD order.jar app.jar
RUN sh -c 'touch /app.jar'
ENTRYPOINT ["java","-Xmx128m","-Xms128m","-
Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
25
CI/CD với Jenkins & Docker
• Sử dụng Spotify docker-maven-plugin:
• Tách lớp thư viện ra thư mục riêng & cache được layer này, giảm kích thước
image (~75MB)
• Giảm network traffic & thời gian deploy (~200-700KB dữ liệu mỗi lần update)
• Tự động gán tag Docker image:
{git_commit_short_code}-{branch} -> 4b4a71ef-dev
26
Kết hợp Netflix OSS với Docker Swarm
• Zuul làm API Gateway
• Eureka làm Service Discovery
• Ribbon Client để gọi giữa các microservices
• Docker Swarm:
• Quản lý các microservices
• Deploy, scale, update các microservices
27
28
1. Dev push code lên Gitlab
2. Gitlab webhook
gọi sang Jenkins
3. Jenkins pull code từ Gitlab:
- mã nguồn
- Dockerfile
- Jenkinsfile
4. Biên dịch & build Docker
image, tự động gắn tag image
5. Push image lên
Private Docker Registry
6. Bắn webhook sang Jenkins
server khác, thực hiện lệnh
docker service update
Bài toán xử lý nghiệp vụ của
SAPO
29
Yêu cầu với sản phẩm SAPO
• Đáp ứng nhiều nghiệp vụ
• Nghiệp vụ phức tạp
• Maintainable code
• Tính đúng đắn dữ liệu
• Performance
→ lựa chọn Domain Driven Design (DDD) & xử lý bất đồng bộ qua
Message Queue
30
Tại sao chọn DDD?
• Kiểm soát tốt nghiệp vụ trong code
• Code có thể maintain được
• Dễ dàng sửa chữa khi có lỗi hoặc nghiệp vụ thay đổi
• Đảm bảo tính đúng đắn dữ liệu do toàn bộ Aggregate được lưu trong
1 transaction
31
Một số khái niệm
• Entity: đối tượng được định danh
• Aggregate: một nhóm các entity có quan hệ với nhau phản ánh
nghiệp vụ của domain
• Aggregate Root: là entity đại diện cho Aggregate
• Sub Entity: các entity còn lại trong Aggregate
• Repository: lưu trữ aggregate và truy xuất dữ liệu
• Domain Event: các event xảy ra trong Aggregate Root
32
33
Identity trong DDD
• Entity cần được định danh luôn khi khởi tạo
• Kết quả của nghiệp vụ được lưu trữ qua 1 transaction (Repository
save nguyên Aggregate Root)
• Có nhiều nghiệp vụ map các entity & sub entity, cần biết Id của nhau.
Ví dụ: Order tạo Fulfillment -> event fulfillment_created, data
của event cần có FulfillmentId
→ SQL Server support cơ chế generate Id
SELECT NEXT VALUE FOR SeqOrderId
EXEC sp_sequence_get_range
34
Xử lý xung đột khi update dữ liệu
• Cùng 1 thời điểm có nhiều người dùng cập nhật 1 entity.
• Ví dụ: cùng thời điểm 1 nhân viên xác nhận đơn hàng, 1 nhân viên
khác hủy đơn hàng. Cần đảm bảo ai cập nhật trước thành công,
người cập nhật sau thất bại.
→ Optimistic Lock cho Aggregate Root
Đánh version cho bảng Order, mọi thao tác update lên Order hoặc bất
cứ Sub Entity nào trong Order Aggregate cũng sẽ thay đổi order version
35
Tối ưu update cho Repository
• 1 Aggregate chỉ được lưu bằng 1 hàm duy nhất
• Order Domain có 8 Sub Entity liên quan -> update cho ít nhất 9 bảng
→ Cơ chế xác định sự thay đổi ở entity và sub entity, chỉ update entity
và những sub entity nào thay đổi.
Bất cứ thay đổi nào ở sub entity -> thay đổi ở entity
this.modify = true;
this.modifiedOn = Util.getUTC();
36
37
Sơ đồ nghiệp vụ cơ bản
38
Sơ đồ nghiệp vụ cơ bản
Kafka Message Queue
39
Tại sao dùng Kafka?
• Distributed Streaming Platform
• Hỗ trợ Pub/Sub
• High performance
• Đảm bảo consumer xử lý message đúng thứ tự
mà producer gửi trên 1 partition
• Đảm bảo ko mất message, tất cả các message
trong queue đều đc xử lý
• Exactly one message process
40
Exactly one message process
• Mỗi message chỉ được xử lý 1 lần ứng với 1 nghiệp vụ xác định
• Có 2 cách:
• Kafka hỗ trợ - lưu offset & data đẩy vào kafka trong cùng 1 transaction
• Tự implement
• SAPO tự implement do dữ liệu nghiệp vụ lưu trong DB
• Sử dụng transaction cho việc lưu offset đồng thời với việc lưu dữ liệu
nghiệp vụ
41
Vấn đề
42
Aggregate
Save
DB
Kafka
Không đảm bảo được
transaction khi lưu
đồng thời vào DB và
Kafka
Giải pháp: Kafka Connect
43
Aggregate
save
Kafka
ConnectDB
Kafka
Transaction
• Lưu Aggregate + message vào
DB trong cùng transaction
• Kafka connect đẩy msg từ db
vào kafka
→ performance ko tốt bằng đẩy
thằng vào kafka nhưng đảm bảo
chính xác
Ví dụ phân hệ bán hàng
• 2 màn hình bán hàng
• Bán hàng online
• Đồng bộ từ kênh bán hàng
• Nhân viên chọn hàng cho Khách (gọi điện, chat)
• Cần phải giao hàng cho khách
• Bán hàng tại quầy (POS)
• Khách mang hàng ra thanh toán
• Nhận hàng luôn tại quầy
44
45
46
Quy trình online - tuần tự
Tạo đơn Duyệt Đóng gói
Giao hàng,
Thanh toán
47
created event
ETL Job,
Webhook Job
finalized event
ETL Job,
Webhook Job,
Stock Job
fulfillment_added event
ETL Job,
Webhook Job,
Notification Job
fulfillment_received,
payment_added event
ETL Job,
Webhook Job,
Notification Job,
Stock Job,
Debt Job
Quy trình POS – 1 thao tác
48
fulfillment_received
payment_added
ETL Job,
Webhook Job,
Notification Job,
Stock Job,
Debt Job
Tạo đơn
Duyệt
Đóng gói
Xuất kho
Thanh toán
Kafka
created
finalized
fulfillment_added
Lợi ích sử dụng DDD & Message Queue
• 2 quy trình khác nhau nhưng cùng chung 1 Order Domain xử lý
• Linh hoạt trong việc thay đổi quy trình hoặc tạo ra quy trình mới
49
Hướng cải tiến hệ thống
• Đẩy thẳng dữ liệu vào Kafka không phải lưu vào DB
• Tăng Performance phần Order
50
Reference
• http://martinfowler.com/
• http://microservices.io/
• https://github.com/mfornos/awesome-microservices
• http://spring.io/projects
• https://netflix.github.io/
• https://www.slideshare.net/juminchoi/bizweb-microservices-
architecture
• https://www.slideshare.net/juminchoi/building-bizweb-
microservices-with-docker
51
52
• Business Analyst
• .NET Developer
• Java Developer
• Android Developer
Contact
• Nguyễn Minh Khôi – DKT Technology
• Email: khoinm@dkt.com.vn
• Facebook: https://fb.com/khoinguyen84
53
Thank you!
Q&A

More Related Content

What's hot

Go micro framework to build microservices
Go micro framework to build microservicesGo micro framework to build microservices
Go micro framework to build microservicesTechMaster Vietnam
 
Software architecture for high traffic website
Software architecture for high traffic websiteSoftware architecture for high traffic website
Software architecture for high traffic websiteTung Nguyen Thanh
 
Grokking TechTalk #33: High Concurrency Architecture at TIKI
Grokking TechTalk #33: High Concurrency Architecture at TIKIGrokking TechTalk #33: High Concurrency Architecture at TIKI
Grokking TechTalk #33: High Concurrency Architecture at TIKIGrokking VN
 
DDD - DuyLV - VINID - 17.07.2019
DDD - DuyLV - VINID - 17.07.2019DDD - DuyLV - VINID - 17.07.2019
DDD - DuyLV - VINID - 17.07.2019Lê Văn Duy
 
Tiki.vn - How we scale as a tech startup
Tiki.vn - How we scale as a tech startupTiki.vn - How we scale as a tech startup
Tiki.vn - How we scale as a tech startupTung Ns
 
itlchn 20 - Kien truc he thong chung khoan - Phan 2
itlchn 20 - Kien truc he thong chung khoan - Phan 2itlchn 20 - Kien truc he thong chung khoan - Phan 2
itlchn 20 - Kien truc he thong chung khoan - Phan 2IT Expert Club
 
Domain Driven Design Introduction
Domain Driven Design IntroductionDomain Driven Design Introduction
Domain Driven Design IntroductionTung Nguyen Thanh
 
Room 2 - 4 - Juncheng Anthony Lin - Redhat - A Practical Approach to Traditio...
Room 2 - 4 - Juncheng Anthony Lin - Redhat - A Practical Approach to Traditio...Room 2 - 4 - Juncheng Anthony Lin - Redhat - A Practical Approach to Traditio...
Room 2 - 4 - Juncheng Anthony Lin - Redhat - A Practical Approach to Traditio...Vietnam Open Infrastructure User Group
 
Kubernetes and service mesh application
Kubernetes  and service mesh applicationKubernetes  and service mesh application
Kubernetes and service mesh applicationThao Huynh Quang
 
Introduction to kubernetes
Introduction to kubernetesIntroduction to kubernetes
Introduction to kubernetesRishabh Indoria
 
Understanding MicroSERVICE Architecture with Java & Spring Boot
Understanding MicroSERVICE Architecture with Java & Spring BootUnderstanding MicroSERVICE Architecture with Java & Spring Boot
Understanding MicroSERVICE Architecture with Java & Spring BootKashif Ali Siddiqui
 
Design patterns for microservice architecture
Design patterns for microservice architectureDesign patterns for microservice architecture
Design patterns for microservice architectureThe Software House
 
SOLID & Design Patterns
SOLID & Design PatternsSOLID & Design Patterns
SOLID & Design PatternsGrokking VN
 
Getting Started with Spring Authorization Server
Getting Started with Spring Authorization ServerGetting Started with Spring Authorization Server
Getting Started with Spring Authorization ServerVMware Tanzu
 
Introduction to Microservices
Introduction to MicroservicesIntroduction to Microservices
Introduction to MicroservicesMahmoudZidan41
 
Microservice Architecture
Microservice ArchitectureMicroservice Architecture
Microservice ArchitectureNguyen Tung
 

What's hot (20)

Go micro framework to build microservices
Go micro framework to build microservicesGo micro framework to build microservices
Go micro framework to build microservices
 
Software architecture for high traffic website
Software architecture for high traffic websiteSoftware architecture for high traffic website
Software architecture for high traffic website
 
Grokking TechTalk #33: High Concurrency Architecture at TIKI
Grokking TechTalk #33: High Concurrency Architecture at TIKIGrokking TechTalk #33: High Concurrency Architecture at TIKI
Grokking TechTalk #33: High Concurrency Architecture at TIKI
 
DDD - DuyLV - VINID - 17.07.2019
DDD - DuyLV - VINID - 17.07.2019DDD - DuyLV - VINID - 17.07.2019
DDD - DuyLV - VINID - 17.07.2019
 
Tiki.vn - How we scale as a tech startup
Tiki.vn - How we scale as a tech startupTiki.vn - How we scale as a tech startup
Tiki.vn - How we scale as a tech startup
 
itlchn 20 - Kien truc he thong chung khoan - Phan 2
itlchn 20 - Kien truc he thong chung khoan - Phan 2itlchn 20 - Kien truc he thong chung khoan - Phan 2
itlchn 20 - Kien truc he thong chung khoan - Phan 2
 
Domain Driven Design Introduction
Domain Driven Design IntroductionDomain Driven Design Introduction
Domain Driven Design Introduction
 
Room 2 - 4 - Juncheng Anthony Lin - Redhat - A Practical Approach to Traditio...
Room 2 - 4 - Juncheng Anthony Lin - Redhat - A Practical Approach to Traditio...Room 2 - 4 - Juncheng Anthony Lin - Redhat - A Practical Approach to Traditio...
Room 2 - 4 - Juncheng Anthony Lin - Redhat - A Practical Approach to Traditio...
 
Docker 101
Docker 101Docker 101
Docker 101
 
Kubernetes and service mesh application
Kubernetes  and service mesh applicationKubernetes  and service mesh application
Kubernetes and service mesh application
 
Introduction to kubernetes
Introduction to kubernetesIntroduction to kubernetes
Introduction to kubernetes
 
Understanding MicroSERVICE Architecture with Java & Spring Boot
Understanding MicroSERVICE Architecture with Java & Spring BootUnderstanding MicroSERVICE Architecture with Java & Spring Boot
Understanding MicroSERVICE Architecture with Java & Spring Boot
 
Microservice architecture
Microservice architectureMicroservice architecture
Microservice architecture
 
Design patterns for microservice architecture
Design patterns for microservice architectureDesign patterns for microservice architecture
Design patterns for microservice architecture
 
SOLID & Design Patterns
SOLID & Design PatternsSOLID & Design Patterns
SOLID & Design Patterns
 
Introduction to microservices
Introduction to microservicesIntroduction to microservices
Introduction to microservices
 
Why Microservice
Why Microservice Why Microservice
Why Microservice
 
Getting Started with Spring Authorization Server
Getting Started with Spring Authorization ServerGetting Started with Spring Authorization Server
Getting Started with Spring Authorization Server
 
Introduction to Microservices
Introduction to MicroservicesIntroduction to Microservices
Introduction to Microservices
 
Microservice Architecture
Microservice ArchitectureMicroservice Architecture
Microservice Architecture
 

Similar to Kinh nghiệm triển khai Microservices tại Sapo.vn

Pham Anh Tu - TK Framework
Pham Anh Tu - TK FrameworkPham Anh Tu - TK Framework
Pham Anh Tu - TK FrameworkVu Hung Nguyen
 
Giới thiệu ASP.NET Core 2.0
Giới thiệu ASP.NET Core 2.0Giới thiệu ASP.NET Core 2.0
Giới thiệu ASP.NET Core 2.0Huân Bùi Đình
 
Lập trình web với các công nghệ phổ biến
Lập trình web với các công nghệ phổ biếnLập trình web với các công nghệ phổ biến
Lập trình web với các công nghệ phổ biếnSon Nguyen
 
vndscasestudy1-160513170651.pdf
vndscasestudy1-160513170651.pdfvndscasestudy1-160513170651.pdf
vndscasestudy1-160513170651.pdftungdinhthanh3
 
Bai 4 lap trình phia client
Bai 4  lap trình phia clientBai 4  lap trình phia client
Bai 4 lap trình phia clientLee Nam Nguyen
 
the real-time operating system and real-time programming
the real-time operating system and real-time programmingthe real-time operating system and real-time programming
the real-time operating system and real-time programmingDucLe868608
 
Itlc2015
Itlc2015Itlc2015
Itlc2015Huy Do
 
Lập trình background job bằng azurequeue và webjob sử dụng azure storage emul...
Lập trình background job bằng azurequeue và webjob sử dụng azure storage emul...Lập trình background job bằng azurequeue và webjob sử dụng azure storage emul...
Lập trình background job bằng azurequeue và webjob sử dụng azure storage emul...VKhang Yang
 
Giải mã hệ thống quản trị bằng công nghệ của thế giới di động - P2
Giải mã hệ thống quản trị bằng công nghệ của thế giới di động - P2Giải mã hệ thống quản trị bằng công nghệ của thế giới di động - P2
Giải mã hệ thống quản trị bằng công nghệ của thế giới di động - P2ThuThuat Vip
 
Bai3 basic servlets_956
Bai3 basic servlets_956Bai3 basic servlets_956
Bai3 basic servlets_956Ham Chơi
 
Cloud computing and OpenStack
Cloud computing and OpenStackCloud computing and OpenStack
Cloud computing and OpenStackMinh Le
 
Cloud computing and OpenStack
Cloud computing and OpenStackCloud computing and OpenStack
Cloud computing and OpenStackMinh Le
 
chuong 1 - Tong quan ve Lap trinh mang.ppt
chuong 1 - Tong quan ve Lap trinh mang.pptchuong 1 - Tong quan ve Lap trinh mang.ppt
chuong 1 - Tong quan ve Lap trinh mang.pptkhamgo1191
 
Scop full realtime solutions yeucau mohinh_tiendo setup bbb
Scop full realtime solutions yeucau mohinh_tiendo setup bbbScop full realtime solutions yeucau mohinh_tiendo setup bbb
Scop full realtime solutions yeucau mohinh_tiendo setup bbblaonap166
 
[123doc.vn] xay dung he thong mang cho doanh nhiep nho
[123doc.vn]   xay dung he thong mang cho doanh nhiep nho[123doc.vn]   xay dung he thong mang cho doanh nhiep nho
[123doc.vn] xay dung he thong mang cho doanh nhiep nhoNguyễn Quân
 
VoIP with Opensips
VoIP with OpensipsVoIP with Opensips
VoIP with OpensipsTrần Thanh
 
Ex 1 chapter03-appliation-layer-tony_chen - tieng viet
Ex 1 chapter03-appliation-layer-tony_chen - tieng vietEx 1 chapter03-appliation-layer-tony_chen - tieng viet
Ex 1 chapter03-appliation-layer-tony_chen - tieng vietĐô GiẢn
 

Similar to Kinh nghiệm triển khai Microservices tại Sapo.vn (20)

Pham Anh Tu - TK Framework
Pham Anh Tu - TK FrameworkPham Anh Tu - TK Framework
Pham Anh Tu - TK Framework
 
Giới thiệu ASP.NET Core 2.0
Giới thiệu ASP.NET Core 2.0Giới thiệu ASP.NET Core 2.0
Giới thiệu ASP.NET Core 2.0
 
Lập trình web với các công nghệ phổ biến
Lập trình web với các công nghệ phổ biếnLập trình web với các công nghệ phổ biến
Lập trình web với các công nghệ phổ biến
 
vndscasestudy1-160513170651.pdf
vndscasestudy1-160513170651.pdfvndscasestudy1-160513170651.pdf
vndscasestudy1-160513170651.pdf
 
Bai 4 lap trình phia client
Bai 4  lap trình phia clientBai 4  lap trình phia client
Bai 4 lap trình phia client
 
the real-time operating system and real-time programming
the real-time operating system and real-time programmingthe real-time operating system and real-time programming
the real-time operating system and real-time programming
 
Itlc2015
Itlc2015Itlc2015
Itlc2015
 
Lập trình background job bằng azurequeue và webjob sử dụng azure storage emul...
Lập trình background job bằng azurequeue và webjob sử dụng azure storage emul...Lập trình background job bằng azurequeue và webjob sử dụng azure storage emul...
Lập trình background job bằng azurequeue và webjob sử dụng azure storage emul...
 
Dsd05 01-rpca
Dsd05 01-rpcaDsd05 01-rpca
Dsd05 01-rpca
 
Giải mã hệ thống quản trị bằng công nghệ của thế giới di động - P2
Giải mã hệ thống quản trị bằng công nghệ của thế giới di động - P2Giải mã hệ thống quản trị bằng công nghệ của thế giới di động - P2
Giải mã hệ thống quản trị bằng công nghệ của thế giới di động - P2
 
Bai3 basic servlets_956
Bai3 basic servlets_956Bai3 basic servlets_956
Bai3 basic servlets_956
 
Cloud computing and OpenStack
Cloud computing and OpenStackCloud computing and OpenStack
Cloud computing and OpenStack
 
Cloud computing and OpenStack
Cloud computing and OpenStackCloud computing and OpenStack
Cloud computing and OpenStack
 
chuong 1 - Tong quan ve Lap trinh mang.ppt
chuong 1 - Tong quan ve Lap trinh mang.pptchuong 1 - Tong quan ve Lap trinh mang.ppt
chuong 1 - Tong quan ve Lap trinh mang.ppt
 
Scop full realtime solutions yeucau mohinh_tiendo setup bbb
Scop full realtime solutions yeucau mohinh_tiendo setup bbbScop full realtime solutions yeucau mohinh_tiendo setup bbb
Scop full realtime solutions yeucau mohinh_tiendo setup bbb
 
Dsd02 sta
Dsd02 staDsd02 sta
Dsd02 sta
 
[123doc.vn] xay dung he thong mang cho doanh nhiep nho
[123doc.vn]   xay dung he thong mang cho doanh nhiep nho[123doc.vn]   xay dung he thong mang cho doanh nhiep nho
[123doc.vn] xay dung he thong mang cho doanh nhiep nho
 
Giới thiệu chung về plc s7 1200
Giới thiệu chung về plc s7 1200Giới thiệu chung về plc s7 1200
Giới thiệu chung về plc s7 1200
 
VoIP with Opensips
VoIP with OpensipsVoIP with Opensips
VoIP with Opensips
 
Ex 1 chapter03-appliation-layer-tony_chen - tieng viet
Ex 1 chapter03-appliation-layer-tony_chen - tieng vietEx 1 chapter03-appliation-layer-tony_chen - tieng viet
Ex 1 chapter03-appliation-layer-tony_chen - tieng viet
 

Kinh nghiệm triển khai Microservices tại Sapo.vn

  • 1. Kinh nghiệm triển khai Microservices tại Sapo.vn Nguyễn Minh Khôi CTO DKT Technology dkt.com.vn
  • 2. Agenda • Giới thiệu về Sapo • Kiến trúc Microservices • Bài toán nghiệp vụ của Sapo 2
  • 4. 4
  • 5. 5
  • 7. Programming Languages Frameworks & Libraries Web ServersDatabases Message Queues |S3, EC2, Route53 Cloud Services Others Sapo Tech Stack 7
  • 8. Sapo Microservices Components • Dựa trên Spring Boot & Netflix OSS • Service Discovery: Eureka (Server), Ribbon (Client) • API Gateway: Zuul • Centralized Configuration: Spring Cloud Config • API Security: Spring Security & Spring Security OAuth • REST API: Spring Boot • Job Service: Kafka & Spring Boot 8
  • 9. Sapo Microservices Architecture 9 Jobs Services Nginx Backend (.NET MVC) API Gateway (Zuul) OAuth Server (Spring OAuth) Browser 3rd Apps Kafka Eureka Server Redis Session Application Services (Spring Boot) Config Server Job Services Webhooks Service RabbitMQ Mobile app
  • 10. Routing & Service Discovery 10
  • 12. Request trong hệ thống Microservices • Service chạy trên nhiều máy chủ, ở nhiều port khác nhau • Các service có thể bật, tắt, bổ sung bất cứ lúc nào → Làm sao để biết service ở đâu để gọi? 12
  • 13. Service Discovery - Eureka • Mỗi 1 service được định danh bằng serviceId • Service sử dụng Eureka Client để tương tác với Eureka Server: • Register: đăng ký mới (serviceId, host, port) • Renew: sử dụng heartbeats định kỳ đăng ký lại để biết service còn hoạt động • Get Registry: trả về danh sách host:port của các service theo serviceId 13
  • 14. Request vào hệ thống Microservices • Kết nối vào hệ thống trở nên phức tạp do phải biết serviceId, phải kết nối đến Service Discovery • Nginx không biết được sự thay đổi của các service để gọi & cân tải → Làm sao để đơn giản hóa việc gọi vào các microservices? 14
  • 15. API Gateway - Zuul • Địa chỉ truy xuất duy nhất để gọi vào các microservices • Zuul là edge service -> không dùng để các microservices gọi lẫn nhau • Zuul sử dụng Ribbon để gọi tới các service • Eureka Client • Client Load Balancer • Caching • ZuulFilter: tiền xử lý request trước khi gọi sang các service 15
  • 16. API Gateway & Service Discovery 16 Get Registry order 10.0.0.1:8080 10.0.0.2:8081 10.0.0.3:8082
  • 18. Centralized Configuration 18 Vấn đề: - Cấu hình phân tán, khó kiểm soát - Các service có 1 số cấu hình chung, thay đổi là phải đổi hàng loạt - Reload config khi đang chạy
  • 20. Spring Cloud Config • Thông tin file cấu hình được lưu trong git hoặc file vật lý • Tên file: {serviceId}.yml • Nhiều môi trường: dev, test, stage, live... • Kế thừa từ application.yml: mọi service đều lấy cấu hình chung • File bootstrap.yml: cấu hình serviceId, config server, môi trường • Reload Config: HTTP GET [service-host:port]/refresh • Spring Cloud Bus – auto reload 20
  • 22. Đối tượng yêu cầu truy cập • 1st Party: Backend, quản trị hệ thống...: toàn quyền truy xuất mọi website • 3rd Party: ứng dụng của các nhà phát triển cung cấp thêm tính năng cho chủ cửa hàng: chủ cửa hàng cấp quyền truy xuất từng tài nguyên • Mobile app: đăng nhập để lấy token truy xuất, quyền theo tài khoản đăng nhập →Cần 1 phương thức xác thực & kiểm tra quyền linh hoạt -> OAuth2 + Spring Security 22
  • 23. 23 Ghi chú: • 3rd Apps: xác thực OAuth qua Access Token • Sapo Mobile App: Client Credential • Backend: Client Credential, Session Credential (Share session giữa Backend và OAuth Server). • 3rd App: có quyền trên mọi cửa hàng , Sapo Mobile App + Backend: Có quyền trên cửa hàng được cấu hình
  • 24. CI/CD với Docker Swarm & Jenkins 24
  • 25. 1 Dockerfile cho mọi service FROM frolvlad/alpine-oraclejdk8:slim ADD lib lib ADD order.jar app.jar RUN sh -c 'touch /app.jar' ENTRYPOINT ["java","-Xmx128m","-Xms128m","- Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] 25
  • 26. CI/CD với Jenkins & Docker • Sử dụng Spotify docker-maven-plugin: • Tách lớp thư viện ra thư mục riêng & cache được layer này, giảm kích thước image (~75MB) • Giảm network traffic & thời gian deploy (~200-700KB dữ liệu mỗi lần update) • Tự động gán tag Docker image: {git_commit_short_code}-{branch} -> 4b4a71ef-dev 26
  • 27. Kết hợp Netflix OSS với Docker Swarm • Zuul làm API Gateway • Eureka làm Service Discovery • Ribbon Client để gọi giữa các microservices • Docker Swarm: • Quản lý các microservices • Deploy, scale, update các microservices 27
  • 28. 28 1. Dev push code lên Gitlab 2. Gitlab webhook gọi sang Jenkins 3. Jenkins pull code từ Gitlab: - mã nguồn - Dockerfile - Jenkinsfile 4. Biên dịch & build Docker image, tự động gắn tag image 5. Push image lên Private Docker Registry 6. Bắn webhook sang Jenkins server khác, thực hiện lệnh docker service update
  • 29. Bài toán xử lý nghiệp vụ của SAPO 29
  • 30. Yêu cầu với sản phẩm SAPO • Đáp ứng nhiều nghiệp vụ • Nghiệp vụ phức tạp • Maintainable code • Tính đúng đắn dữ liệu • Performance → lựa chọn Domain Driven Design (DDD) & xử lý bất đồng bộ qua Message Queue 30
  • 31. Tại sao chọn DDD? • Kiểm soát tốt nghiệp vụ trong code • Code có thể maintain được • Dễ dàng sửa chữa khi có lỗi hoặc nghiệp vụ thay đổi • Đảm bảo tính đúng đắn dữ liệu do toàn bộ Aggregate được lưu trong 1 transaction 31
  • 32. Một số khái niệm • Entity: đối tượng được định danh • Aggregate: một nhóm các entity có quan hệ với nhau phản ánh nghiệp vụ của domain • Aggregate Root: là entity đại diện cho Aggregate • Sub Entity: các entity còn lại trong Aggregate • Repository: lưu trữ aggregate và truy xuất dữ liệu • Domain Event: các event xảy ra trong Aggregate Root 32
  • 33. 33
  • 34. Identity trong DDD • Entity cần được định danh luôn khi khởi tạo • Kết quả của nghiệp vụ được lưu trữ qua 1 transaction (Repository save nguyên Aggregate Root) • Có nhiều nghiệp vụ map các entity & sub entity, cần biết Id của nhau. Ví dụ: Order tạo Fulfillment -> event fulfillment_created, data của event cần có FulfillmentId → SQL Server support cơ chế generate Id SELECT NEXT VALUE FOR SeqOrderId EXEC sp_sequence_get_range 34
  • 35. Xử lý xung đột khi update dữ liệu • Cùng 1 thời điểm có nhiều người dùng cập nhật 1 entity. • Ví dụ: cùng thời điểm 1 nhân viên xác nhận đơn hàng, 1 nhân viên khác hủy đơn hàng. Cần đảm bảo ai cập nhật trước thành công, người cập nhật sau thất bại. → Optimistic Lock cho Aggregate Root Đánh version cho bảng Order, mọi thao tác update lên Order hoặc bất cứ Sub Entity nào trong Order Aggregate cũng sẽ thay đổi order version 35
  • 36. Tối ưu update cho Repository • 1 Aggregate chỉ được lưu bằng 1 hàm duy nhất • Order Domain có 8 Sub Entity liên quan -> update cho ít nhất 9 bảng → Cơ chế xác định sự thay đổi ở entity và sub entity, chỉ update entity và những sub entity nào thay đổi. Bất cứ thay đổi nào ở sub entity -> thay đổi ở entity this.modify = true; this.modifiedOn = Util.getUTC(); 36
  • 37. 37 Sơ đồ nghiệp vụ cơ bản
  • 38. 38 Sơ đồ nghiệp vụ cơ bản
  • 40. Tại sao dùng Kafka? • Distributed Streaming Platform • Hỗ trợ Pub/Sub • High performance • Đảm bảo consumer xử lý message đúng thứ tự mà producer gửi trên 1 partition • Đảm bảo ko mất message, tất cả các message trong queue đều đc xử lý • Exactly one message process 40
  • 41. Exactly one message process • Mỗi message chỉ được xử lý 1 lần ứng với 1 nghiệp vụ xác định • Có 2 cách: • Kafka hỗ trợ - lưu offset & data đẩy vào kafka trong cùng 1 transaction • Tự implement • SAPO tự implement do dữ liệu nghiệp vụ lưu trong DB • Sử dụng transaction cho việc lưu offset đồng thời với việc lưu dữ liệu nghiệp vụ 41
  • 42. Vấn đề 42 Aggregate Save DB Kafka Không đảm bảo được transaction khi lưu đồng thời vào DB và Kafka
  • 43. Giải pháp: Kafka Connect 43 Aggregate save Kafka ConnectDB Kafka Transaction • Lưu Aggregate + message vào DB trong cùng transaction • Kafka connect đẩy msg từ db vào kafka → performance ko tốt bằng đẩy thằng vào kafka nhưng đảm bảo chính xác
  • 44. Ví dụ phân hệ bán hàng • 2 màn hình bán hàng • Bán hàng online • Đồng bộ từ kênh bán hàng • Nhân viên chọn hàng cho Khách (gọi điện, chat) • Cần phải giao hàng cho khách • Bán hàng tại quầy (POS) • Khách mang hàng ra thanh toán • Nhận hàng luôn tại quầy 44
  • 45. 45
  • 46. 46
  • 47. Quy trình online - tuần tự Tạo đơn Duyệt Đóng gói Giao hàng, Thanh toán 47 created event ETL Job, Webhook Job finalized event ETL Job, Webhook Job, Stock Job fulfillment_added event ETL Job, Webhook Job, Notification Job fulfillment_received, payment_added event ETL Job, Webhook Job, Notification Job, Stock Job, Debt Job
  • 48. Quy trình POS – 1 thao tác 48 fulfillment_received payment_added ETL Job, Webhook Job, Notification Job, Stock Job, Debt Job Tạo đơn Duyệt Đóng gói Xuất kho Thanh toán Kafka created finalized fulfillment_added
  • 49. Lợi ích sử dụng DDD & Message Queue • 2 quy trình khác nhau nhưng cùng chung 1 Order Domain xử lý • Linh hoạt trong việc thay đổi quy trình hoặc tạo ra quy trình mới 49
  • 50. Hướng cải tiến hệ thống • Đẩy thẳng dữ liệu vào Kafka không phải lưu vào DB • Tăng Performance phần Order 50
  • 51. Reference • http://martinfowler.com/ • http://microservices.io/ • https://github.com/mfornos/awesome-microservices • http://spring.io/projects • https://netflix.github.io/ • https://www.slideshare.net/juminchoi/bizweb-microservices- architecture • https://www.slideshare.net/juminchoi/building-bizweb- microservices-with-docker 51
  • 52. 52 • Business Analyst • .NET Developer • Java Developer • Android Developer
  • 53. Contact • Nguyễn Minh Khôi – DKT Technology • Email: khoinm@dkt.com.vn • Facebook: https://fb.com/khoinguyen84 53