SlideShare a Scribd company logo
1 of 29
 Một trong những Broker (công ty môi giới) chính trên
thị trường VN
 Số tài khoản khách hàng: ~100.000
 Thị phần môi giới: Đứng thứ 4 trên HSX, thứ 2 trên
HNX (số liệu quý 1 năm 2016)
 Số lệnh đặt trong ngày: ~20.000 lệnh. Cao điểm khi thị
trường nóng có thể vượt 30.000 lệnh
 Hệ thống core: phát triển bởi FSS, một đơn vị phát triển
core chứng khoán có tiếng trên thị trường Việt Nam
 Một số phần trong hệ thống được phát triển hoặc nâng
cấp bởi VNDS
 Hệ thống hỗ trợ nhiều kênh đặt lệnh: Online, ATD/BD,
BO, Bloomberg (via FIX 4.2 protocol) …
 Hệ thống hoạt động không thật sự ổn định
 Các vấn đề gặp phải: dead locking database (nhiều lúc
phải restart Oracle DB của Back Office)
 Gửi lặp lệnh vào sở(xảy ra vào ngày 27-08-2014 khi
VNDS gửi nhiều hơn 20.000 lệnh lặp vào sàn HNX)
 Khả năng xử lý của hệ thống đạt max ~10 lệnh/s, độ trễ
~4s
 Hệ thống có khả năng xử lý ổn định 5000-10000 lệnh/s
 Độ trễ hệ thống < 4ms (không tính độ trễ sinh ra do
đường truyền kết nối đến sở, khoảng 70 ms đối với sở
HSX)
-> Mục tiêu nâng hiệu năng của hệ thống lên 1000 lần
 Tách hoàn toàn phần xử lý lệnh khỏi BO, xây dựng một
hệ thống chuyên biệt mới hoàn toàn xử lý việc này:
ORS/OMS (Orders routing and management system)
 Hệ thống ORS sẽ thực hiện load toàn bộ dữ liệu cần
thiết từ BO vào đầu ngày giao dịch (BOD) và thực hiện
xóa toàn bộ dữ liệu (reset) vào cuối ngày giao dịch
(EOD)
 Dữ liệu cần đồng bộ trong ngày (rút tiền, nộp tiền, mở
tài khoản mới … ) sẽ được thực hiện qua hoặc web
service hoặc messages push
 Ngôn ngữ: C/C++ và Java
• 90% hệ thống phát triển bằng Java (plain java, không
sử dụng bất cứ framework nào)
• 10% hệ thống (các modules xử lý dữ liệu thị trường và
Gateways) phát triển bằng C/C++
• 100% C: May be the next version!
 OS: Linux/UNIX: Lựa chọn hiển nhiên ở server side
 Messages queues: ActiveMQ, ZeroMQ
• Apache ActiveMQ: Open source về messages broker được sử dụng rộng rãi nhất hiện nay
• ZeroMQ: Giải pháp opensource về messaging nhanh nhất hiện tại. Hỗ trợ Inproc, IPC, TCP, reliable
multicast (PGM) …
 FIX engines: QuickFiX CPP, QuickfixJ
 Databases: PostgresQL
 Web server: Jetty
 Cần một tool đủ tốt để theo dõi hệ thống chạy trên môi trường production, theo thời gian thực
 Cost để benchmark ~0 (hoặc vài magnitude thấp hơn cost xử lý orders của hệ thống)
• Observer effect: “Measurements of certain systems cannot be made without affecting the systems”
-> Tự phát triển
 Performance Statistics 23:06:35
 Tag Avg(us) Min Max Std Dev Count
 INSERT into forward VALUES(DEFAU 97.79 62 42186 328.64 18740
 Update Complex Accounts 0.20 0 1351 11.31 18761
 QFJ-01 214.26 60 20778 546.56 18761
 DOrder 507.66 163 53537 1011.87 18762
 Performance Statistics 23:07:05
 Tag Avg(us) Min Max Std Dev Count
 INSERT into forward VALUES(DEFAU 82.35 66 132 13.07 1360
 Update Complex Accounts 0.07 0 35 1.00 1339
 QFJ-01 169.18 59 4196 374.89 1339
 DOrder 366.78 162 8208 526.34 1338
 Log4J: Quá phức tạp, quá chậm
-> Chuyển sang sử dụng phiên bản customize của
logback. Thực hiện tuning/test và chỉ để lại những
options đảm bảo performance.
 OpenJDK, Sun JDK: Chậm, độ ổn định về performance
kém
-> Chuyển sang dùng jrockit và sử dụng các options để
tuning garbage collector
 Hệ thống hoạt động 100% (hay gần như 100%) theo cơ
chế asynchronous
• No hazelcast, redis hay bất cứ giải pháp in memory
data-grid nào
• Hệ thống cache dữ liệu trên memory bất cứ khi nào có
thể. Databases chỉ được dùng chủ yếu cho việc backup
và recovery khi xảy ra sự cố cần restart hệ thống
• Việc trao đổi thông tin đi và về chủ yếu được thực hiện
qua các messages queues
 Một vài con số cơ bản về communication cost (round-
trip latency)
• In-process (inter-threads): ~10 us
• Inter-process (IPC): ~15 us
• TCP/UDP on local host: ~50us
• TCP/UDP on different servers: ~300 us
 Yêu cầu bắt buộc: phải hỗ trợ chuẩn FIX (Financial
Information Exchange) do đây là chuẩn giao tiếp chung
của tất cả các hệ thống tài chính hiện đại
 Ưu điểm của chuẩn FIX: Dễ đọc, có thể tùy ý mở rộng
hoặc bổ sung thêm nghiệp vụ. Có sẵn các open source
để sử dụng (QuickFIX hay QuickFixJ)
 Nhược điểm: Cồng kềnh, cost để parsing messages cao
 Viết tắt của Financial Information Exchange
 Được đưa vào sử dụng từ 1992, hiện FIX
protocol đã trở thành chuẩn giao tiếp chung
của thế giới cho giao dịch chứng khoán điện
tử
 FIX protocol bao gồm: communication
protocol, messages specification và business
guide line
 http://www.fixtradingcommunity.org/FIXimat
e/FIXimate3.0/
FIX message sample:
8=FIX.4.4 9=221 35=D 34=33 449=ORS_1_ACTIVE 52=20151023-03:56:04.321 56=HSX_GATEWAY 57=1 11=50000018
38=10 40=2 44=73.5 54=2 55=MSN 59=0 60=20151023-03:56:04.321 453=3 448=021 447=C 452=1 448=0211 447=D 452=12
448=021C686899 447=D 452=3 10=187
HSX message sample (AutoT protocol):
A!1I021021150000018021C686899MSN S10 10 73.500M C
FIX message dài khoảng 200 bytes trong khi AutoT
message tương ứng dài khoảng 70 bytes.
 Các modules GWIN tiếp nhận lệnh theo FIX protocol
 Các modules GWIN hoàn toàn stateless, hoạt động như
các switches. Có thể dễ dàng load balancing tùy ý
 Sau khi parsing message và kiểm tra các giá trị truyền
vào hợp lệ, GWIN sẽ gửi các message này vào OMS
 Asynchronous (gần như 100%)
 Toàn bộ các tài khoản do OMS quản lý được cache trên
memory
 Chỉ một số orders gần nhất được cache trên memory
(giá trị có thể tùy chỉnh)
 Orders và các thay đổi liên quan đến tài khoản sau khi
update trên memory được đẩy vào các queues để thực
hiện ghi bất đồng bộ xuống DB
 Tự xây dựng dựa trên array thuần túy
 Thuật toán và implementation phần orders caching
được thiết kế để không phải sử dụng bất cứ cơ chế
locking nào
 1 single thread sẽ quản lý việc đưa objects mới lên
cache và remove objects cũ ra khỏi cache. 1 thread
khác quản lý việc cập nhật các objects nằm trên cache
Code sample:
 Code unsafe:
public OrderBase getOrderFromCache(int seq, OrderBase newInfo) {
if (orders[seq] == null) return null;
orders[seq].setField(OrderBase.CUM_QTY, newInfo.getField(OrderBase.CUM_QTY));
orders[seq].setField(OrderBase.LAST_QTY, newInfo.getField(OrderBase.LAST_QTY));
orders[seq].setField(OrderBase.LAST_PX, newInfo.getField(OrderBase.LAST_PX));
return orders[seq];
}
 Code safe:
public OrderBase getOrderFromCache(int seq, OrderBase newInfo) {
OrderBase order = orders[seq];
if (order == null) return null;
order.setField(OrderBase.CUM_QTY, newInfo.getField(OrderBase.CUM_QTY));
order.setField(OrderBase.LAST_QTY, newInfo.getField(OrderBase.LAST_QTY));
order.setField(OrderBase.LAST_PX, newInfo.getField(OrderBase.LAST_PX));
return order;
}
 Cache 100% số tài khoản (có thể sharding theo OMSs)
 Tự xây dựng dựa trên array thuần túy
 Thuật toán và implement phần cache tài khoản được
thiết kế để giảm thiểu sử dụng locking
• Thread nhận lệnh đặt/hủy/sửa và thread cập nhật trạng
thái lệnh từ sở không lock lẫn nhau
 Code unsafe
class Account {
private long balance;
public Account(long balance) {
this.balance = balance;
}
public boolean hold (long amount) {
if (balance >= amount) {
balance -= amount;
return true;
}
return false;
}
public void unhold(long amount) {
balance += amount;
}
public long getBalance() {
return balance;
}
}
 Tài khoản ban đầu có 10.000.000 VND. Thread 1 gọi
hold 1.000.000 VND, Thread 2 gọi unhold 1.000.000
VND, vậy tài khoản cuối cùng có bao nhiêu VND?
• 9.000.000
• 10.000.000
• 11.000.000
• 1 trong các khả năng trên
 Code safe?
class Account {
private long balance;
public Account(long balance) {
this.balance = balance;
}
public synchronized boolean hold (long amount) {
if (balance >= amount) {
balance -= amount;
return true;
}
return false;
}
public synchronized void unhold(long amount) {
balance += amount;
}
public long getBalance() {
return balance;
}
}
 Code safe (như sách dạy)
class Account {
private volatile long balance;
public Account(long balance) {
this.balance = balance;
}
public synchronized boolean hold (long amount) {
if (balance >= amount) {
balance -= amount;
return true;
}
return false;
}
public synchronized void unhold(long amount) {
balance += amount;
}
public long getBalance() {
return balance;
}
}
-> Safe but awfully slow
 Code safe
class Account {
private long initBalance;
private long hold;
private long unhold;
public Account(long balance) {
initBalance = balance;
hold = 0;
unhold = 0;
}
public boolean hold (long amount) {
if (initBalance - hold + unhold >= amount) {
hold += amount;
return true;
}
return false;
}
public void unhold(long amount) {
unhold += amount;
}
public long getBalance() {
return initBalance - hold + unhold;
}
}
 Trong thế giới thiết kế đa luồng, unitest có thể không
hữu ích như bạn nghĩ
 Xác suất xảy ra conflict giữa các threads lớn hay nhỏ?
Định luật Murphy: “Anything that can possibly go
wrong, does”
 Hệ thống đã được thử load test tới khoảng 1500 lệnh/s
đối với 1 OMS chạy trên 1 Linux server 4 cores.
 End to end latency đo được: ~71 ms (~67 ms ping time
vào sở HSX)
10:56:04.321 INFO - GWIN<--: 35=D555=11=000168689966=092815-FIXIN02-1309494=021111=092815-FIXIN02-1309-0-OrderServerATD01-
ATDORS467230214461781838=1040=244=7350054=255=MSN59=060=20151023-03:56:26.10578=179=000168689980=10467=0100=150=dunguyen
10:56:04.321 INFO - Hold balance MSN, 021C686899, -10. Current balance -10
10:56:04.321 INFO - -->GW: 8=FIX.4.49=22135=D34=33449=ORS_1_ACTIVE52=20151023-
03:56:04.32156=HSX_GATEWAY57=111=5000001838=1040=244=73.554=255=MSN59=060=20151023-
03:56:04.321453=3448=021447=C452=1448=0211447=D452=12448=021C686899447=D452=310=187
10:56:04.391 INFO - <--GW: 8=FIX.4.49=32235=834=35549=HSX_GATEWAY52=20151023-03:56:04.38756=ORS_1_ACTIVE212=49213=2I21 932
231050000018231010 73.5 19104 6=011=5000001814=1017=19104 31=73.532=1037=5000001838=1039=241=5000001844=73.554=255=MSN58=2I60=20151023-
03:56:04150=3151=0453=2448=21 447=B452=1448=021C686899447=B452=310=106
10:56:04.391 INFO - Unhold balance MSN, 021C686899, -10. Current balance 0
10:56:04.392 INFO - -->GWIN FIXIN02: 35=81=00016868996=73500.011=092815-FIXIN02-1309-0-OrderServerATD01-
ATDORS467230214461781814=1017=102315105604-HSX_GATEWAY-38-ORS_1_ACTIVE-
1910431=73500.032=1037=5000001838=1039=240=244=7350054=255=MSN59=060=20151023-
03:56:26.105150=F151=078=179=000168689980=10467=1100=150=dunguyen
(10:56:04.319) QFIX <- 8=FIX.4.49=22135=D34=33449=ORS_1_ACTIVE52=20151023-
03:56:04.32156=HSX_GATEWAY57=111=5000001838=1040=244=73.554=255=MSN59=060=20151023-
03:56:04.321453=3448=021447=C452=1448=0211447=D452=12448=021C686899447=D452=310=187
(10:56:04.319) AutoT Send DT(3996,5382) A!1I021021150000018021C686899MSN S10 10 73.500M C
(10:56:04.386) AutoT Recv DT(5382,3997) A!2I21 932 231050000018231010 73.5 19104
(10:56:04.386) QFIX -> 8=FIX.4.49=33735=834=697249=HSX_GATEWAY52=20151023-03:56:04.38756=GW_INTEGRATION_ACTIVE212=49213=2I21
932 231050000018231010 73.5 19104 6=011=932 14=171017=19104 31=73.532=1037=932 38=1039=241=932 44=73.554=155=MSN58=2I60=20151023-
03:56:04150=3151=8290453=2448=21 447=B452=1448=021C057269447=B452=310=113
 Thank you!
 Any questions?
Thảm khảo thêm : http://bit.ly/itlchn-stockcore-event

More Related Content

What's hot

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
 
High Concurrency Architecture at TIKI
High Concurrency Architecture at TIKIHigh Concurrency Architecture at TIKI
High Concurrency Architecture at TIKINghia Minh
 
SOLID & Design Patterns
SOLID & Design PatternsSOLID & Design Patterns
SOLID & Design PatternsGrokking VN
 
Grokking Techtalk #37: Software design and refactoring
 Grokking Techtalk #37: Software design and refactoring Grokking Techtalk #37: Software design and refactoring
Grokking Techtalk #37: Software design and refactoringGrokking VN
 
Go micro framework to build microservices
Go micro framework to build microservicesGo micro framework to build microservices
Go micro framework to build microservicesTechMaster Vietnam
 
Toi uu hoa he thong 30 trieu nguoi dung
Toi uu hoa he thong 30 trieu nguoi dungToi uu hoa he thong 30 trieu nguoi dung
Toi uu hoa he thong 30 trieu nguoi dungIT Expert Club
 
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
 
Asynchronous processing in big system
Asynchronous processing in big systemAsynchronous processing in big system
Asynchronous processing in big systemNghia Minh
 
Xây dụng và kết hợp Kafka, Druid, Superset để đua vào ứng dụng phân tích dữ l...
Xây dụng và kết hợp Kafka, Druid, Superset để đua vào ứng dụng phân tích dữ l...Xây dụng và kết hợp Kafka, Druid, Superset để đua vào ứng dụng phân tích dữ l...
Xây dụng và kết hợp Kafka, Druid, Superset để đua vào ứng dụng phân tích dữ l...Đông Đô
 
Grokking Techtalk #37: Data intensive problem
 Grokking Techtalk #37: Data intensive problem Grokking Techtalk #37: Data intensive problem
Grokking Techtalk #37: Data intensive problemGrokking VN
 
Building Bizweb Microservices with Docker
Building Bizweb Microservices with DockerBuilding Bizweb Microservices with Docker
Building Bizweb Microservices with DockerKhôi Nguyễn Minh
 
Grokking Techtalk #39: How to build an event driven architecture with Kafka ...
 Grokking Techtalk #39: How to build an event driven architecture with Kafka ... Grokking Techtalk #39: How to build an event driven architecture with Kafka ...
Grokking Techtalk #39: How to build an event driven architecture with Kafka ...Grokking VN
 
Grokking TechTalk #31: Asynchronous Communications
Grokking TechTalk #31: Asynchronous CommunicationsGrokking TechTalk #31: Asynchronous Communications
Grokking TechTalk #31: Asynchronous CommunicationsGrokking VN
 
Grokking Techtalk #40: Consistency and Availability tradeoff in database cluster
Grokking Techtalk #40: Consistency and Availability tradeoff in database clusterGrokking Techtalk #40: Consistency and Availability tradeoff in database cluster
Grokking Techtalk #40: Consistency and Availability tradeoff in database clusterGrokking VN
 
Api gateway
Api gatewayApi gateway
Api gatewayenyert
 
Grokking Techtalk: Problem solving for sw engineers
Grokking Techtalk: Problem solving for sw engineersGrokking Techtalk: Problem solving for sw engineers
Grokking Techtalk: Problem solving for sw engineers9diov
 
Bài 1: Làm quen với ASP.NET - Giáo trình FPT - Có ví dụ kèm theo
Bài 1: Làm quen với ASP.NET - Giáo trình FPT - Có ví dụ kèm theoBài 1: Làm quen với ASP.NET - Giáo trình FPT - Có ví dụ kèm theo
Bài 1: Làm quen với ASP.NET - Giáo trình FPT - Có ví dụ kèm theoMasterCode.vn
 
Prometheus Overview
Prometheus OverviewPrometheus Overview
Prometheus OverviewBrian Brazil
 

What's hot (20)

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
 
Sapo Microservices Architecture
Sapo Microservices ArchitectureSapo Microservices Architecture
Sapo Microservices Architecture
 
High Concurrency Architecture at TIKI
High Concurrency Architecture at TIKIHigh Concurrency Architecture at TIKI
High Concurrency Architecture at TIKI
 
SOLID & Design Patterns
SOLID & Design PatternsSOLID & Design Patterns
SOLID & Design Patterns
 
Grokking Techtalk #37: Software design and refactoring
 Grokking Techtalk #37: Software design and refactoring Grokking Techtalk #37: Software design and refactoring
Grokking Techtalk #37: Software design and refactoring
 
Dsd03 sta
Dsd03 staDsd03 sta
Dsd03 sta
 
Go micro framework to build microservices
Go micro framework to build microservicesGo micro framework to build microservices
Go micro framework to build microservices
 
Toi uu hoa he thong 30 trieu nguoi dung
Toi uu hoa he thong 30 trieu nguoi dungToi uu hoa he thong 30 trieu nguoi dung
Toi uu hoa he thong 30 trieu nguoi dung
 
Software architecture for high traffic website
Software architecture for high traffic websiteSoftware architecture for high traffic website
Software architecture for high traffic website
 
Asynchronous processing in big system
Asynchronous processing in big systemAsynchronous processing in big system
Asynchronous processing in big system
 
Xây dụng và kết hợp Kafka, Druid, Superset để đua vào ứng dụng phân tích dữ l...
Xây dụng và kết hợp Kafka, Druid, Superset để đua vào ứng dụng phân tích dữ l...Xây dụng và kết hợp Kafka, Druid, Superset để đua vào ứng dụng phân tích dữ l...
Xây dụng và kết hợp Kafka, Druid, Superset để đua vào ứng dụng phân tích dữ l...
 
Grokking Techtalk #37: Data intensive problem
 Grokking Techtalk #37: Data intensive problem Grokking Techtalk #37: Data intensive problem
Grokking Techtalk #37: Data intensive problem
 
Building Bizweb Microservices with Docker
Building Bizweb Microservices with DockerBuilding Bizweb Microservices with Docker
Building Bizweb Microservices with Docker
 
Grokking Techtalk #39: How to build an event driven architecture with Kafka ...
 Grokking Techtalk #39: How to build an event driven architecture with Kafka ... Grokking Techtalk #39: How to build an event driven architecture with Kafka ...
Grokking Techtalk #39: How to build an event driven architecture with Kafka ...
 
Grokking TechTalk #31: Asynchronous Communications
Grokking TechTalk #31: Asynchronous CommunicationsGrokking TechTalk #31: Asynchronous Communications
Grokking TechTalk #31: Asynchronous Communications
 
Grokking Techtalk #40: Consistency and Availability tradeoff in database cluster
Grokking Techtalk #40: Consistency and Availability tradeoff in database clusterGrokking Techtalk #40: Consistency and Availability tradeoff in database cluster
Grokking Techtalk #40: Consistency and Availability tradeoff in database cluster
 
Api gateway
Api gatewayApi gateway
Api gateway
 
Grokking Techtalk: Problem solving for sw engineers
Grokking Techtalk: Problem solving for sw engineersGrokking Techtalk: Problem solving for sw engineers
Grokking Techtalk: Problem solving for sw engineers
 
Bài 1: Làm quen với ASP.NET - Giáo trình FPT - Có ví dụ kèm theo
Bài 1: Làm quen với ASP.NET - Giáo trình FPT - Có ví dụ kèm theoBài 1: Làm quen với ASP.NET - Giáo trình FPT - Có ví dụ kèm theo
Bài 1: Làm quen với ASP.NET - Giáo trình FPT - Có ví dụ kèm theo
 
Prometheus Overview
Prometheus OverviewPrometheus Overview
Prometheus Overview
 

Viewers also liked

ITEC - Qua trinh phat trien he thong BigData
ITEC - Qua trinh phat trien he thong BigDataITEC - Qua trinh phat trien he thong BigData
ITEC - Qua trinh phat trien he thong BigDataIT Expert Club
 
Nghiên cứu luật kết hợp áp dụng xây dựng mạng chia sẻ đồ vật MiGi
Nghiên cứu luật kết hợp áp dụng xây dựng mạng chia sẻ đồ vật MiGiNghiên cứu luật kết hợp áp dụng xây dựng mạng chia sẻ đồ vật MiGi
Nghiên cứu luật kết hợp áp dụng xây dựng mạng chia sẻ đồ vật MiGiNghia Minh
 
ITLCHN 18 - Automation & DevOps - Automic
ITLCHN 18 -  Automation & DevOps - AutomicITLCHN 18 -  Automation & DevOps - Automic
ITLCHN 18 - Automation & DevOps - AutomicIT Expert Club
 
ITLC - Hanoi - NodeJS - ArrowJS - 27-11 - 2015
ITLC - Hanoi - NodeJS - ArrowJS - 27-11 - 2015ITLC - Hanoi - NodeJS - ArrowJS - 27-11 - 2015
ITLC - Hanoi - NodeJS - ArrowJS - 27-11 - 2015IT Expert Club
 
IM Group hợp tác Haravan - slide nền tảng tổng thể haravan
IM Group hợp tác Haravan - slide nền tảng tổng thể haravanIM Group hợp tác Haravan - slide nền tảng tổng thể haravan
IM Group hợp tác Haravan - slide nền tảng tổng thể haravanDuc Nguyen Minh
 
Overview mobile application advertising systems 16.08.2013
Overview mobile application advertising systems 16.08.2013Overview mobile application advertising systems 16.08.2013
Overview mobile application advertising systems 16.08.2013Quy Bui
 
NoSQL for great good [hanoi.rb talk]
NoSQL for great good [hanoi.rb talk]NoSQL for great good [hanoi.rb talk]
NoSQL for great good [hanoi.rb talk]Huy Do
 
Giới thiệu redmine(2013)
Giới thiệu redmine(2013)Giới thiệu redmine(2013)
Giới thiệu redmine(2013)Quy Bui
 
Building .NET Microservices
Building .NET MicroservicesBuilding .NET Microservices
Building .NET MicroservicesVMware Tanzu
 
google project glass technology
google project glass technologygoogle project glass technology
google project glass technologymahesh b
 
UX Designer Skills
UX Designer SkillsUX Designer Skills
UX Designer SkillsPhowr Quang
 
High performance web sites with multilevel caching
High performance web sites with multilevel cachingHigh performance web sites with multilevel caching
High performance web sites with multilevel cachingDotnet Open Group
 
Zero to one.PETER THIEL
Zero to one.PETER THIELZero to one.PETER THIEL
Zero to one.PETER THIELSreeja Sarella
 

Viewers also liked (15)

ITEC - Qua trinh phat trien he thong BigData
ITEC - Qua trinh phat trien he thong BigDataITEC - Qua trinh phat trien he thong BigData
ITEC - Qua trinh phat trien he thong BigData
 
Nghiên cứu luật kết hợp áp dụng xây dựng mạng chia sẻ đồ vật MiGi
Nghiên cứu luật kết hợp áp dụng xây dựng mạng chia sẻ đồ vật MiGiNghiên cứu luật kết hợp áp dụng xây dựng mạng chia sẻ đồ vật MiGi
Nghiên cứu luật kết hợp áp dụng xây dựng mạng chia sẻ đồ vật MiGi
 
ITLCHN 18 - Automation & DevOps - Automic
ITLCHN 18 -  Automation & DevOps - AutomicITLCHN 18 -  Automation & DevOps - Automic
ITLCHN 18 - Automation & DevOps - Automic
 
ITLC - Hanoi - NodeJS - ArrowJS - 27-11 - 2015
ITLC - Hanoi - NodeJS - ArrowJS - 27-11 - 2015ITLC - Hanoi - NodeJS - ArrowJS - 27-11 - 2015
ITLC - Hanoi - NodeJS - ArrowJS - 27-11 - 2015
 
Graph ql
Graph qlGraph ql
Graph ql
 
IM Group hợp tác Haravan - slide nền tảng tổng thể haravan
IM Group hợp tác Haravan - slide nền tảng tổng thể haravanIM Group hợp tác Haravan - slide nền tảng tổng thể haravan
IM Group hợp tác Haravan - slide nền tảng tổng thể haravan
 
Migrating to aws
Migrating to awsMigrating to aws
Migrating to aws
 
Overview mobile application advertising systems 16.08.2013
Overview mobile application advertising systems 16.08.2013Overview mobile application advertising systems 16.08.2013
Overview mobile application advertising systems 16.08.2013
 
NoSQL for great good [hanoi.rb talk]
NoSQL for great good [hanoi.rb talk]NoSQL for great good [hanoi.rb talk]
NoSQL for great good [hanoi.rb talk]
 
Giới thiệu redmine(2013)
Giới thiệu redmine(2013)Giới thiệu redmine(2013)
Giới thiệu redmine(2013)
 
Building .NET Microservices
Building .NET MicroservicesBuilding .NET Microservices
Building .NET Microservices
 
google project glass technology
google project glass technologygoogle project glass technology
google project glass technology
 
UX Designer Skills
UX Designer SkillsUX Designer Skills
UX Designer Skills
 
High performance web sites with multilevel caching
High performance web sites with multilevel cachingHigh performance web sites with multilevel caching
High performance web sites with multilevel caching
 
Zero to one.PETER THIEL
Zero to one.PETER THIELZero to one.PETER THIEL
Zero to one.PETER THIEL
 

Similar to itlchn 20 - Kien truc he thong chung khoan - Phan 2

Qtu.vn sql - chuong 7
Qtu.vn  sql - chuong 7Qtu.vn  sql - chuong 7
Qtu.vn sql - chuong 7Hoang le Minh
 
120 cau mon quan tri mang public_sv
120 cau mon quan tri mang public_sv120 cau mon quan tri mang public_sv
120 cau mon quan tri mang public_svTin Thấy
 
Morden data center technology
Morden data center technologyMorden data center technology
Morden data center technologyThành Thư Thái
 
Bao cao thuc tap tuan 1 Athena Tran Dang Khoa
Bao cao thuc tap tuan 1 Athena Tran Dang KhoaBao cao thuc tap tuan 1 Athena Tran Dang Khoa
Bao cao thuc tap tuan 1 Athena Tran Dang KhoaÂu Dương Bình
 
Tích hợp microsoft lync, asterisk va skype
Tích hợp microsoft lync, asterisk va skypeTích hợp microsoft lync, asterisk va skype
Tích hợp microsoft lync, asterisk va skypelaonap166
 
Server chuc nang.pptx
Server chuc nang.pptxServer chuc nang.pptx
Server chuc nang.pptxson2483
 
Server chuc nang.pptx
Server chuc nang.pptxServer chuc nang.pptx
Server chuc nang.pptxson2483
 
Chuan viet code va thiet ke giao dien trong C#
Chuan viet code va thiet ke giao dien trong C#Chuan viet code va thiet ke giao dien trong C#
Chuan viet code va thiet ke giao dien trong C#Kuli An
 
Cấu trúc hệ điều hành
Cấu trúc hệ điều hànhCấu trúc hệ điều hành
Cấu trúc hệ điều hànhPhamTuanKhiem
 
Báo cáo tuần 1 nguyen phuong nhung
Báo cáo tuần 1 nguyen phuong nhungBáo cáo tuần 1 nguyen phuong nhung
Báo cáo tuần 1 nguyen phuong nhungNhung Nguyễn
 
php với oracle database
php với oracle databasephp với oracle database
php với oracle databaseNgo Trung
 
De-cuong-on-tap-NNMTPC.pdf
De-cuong-on-tap-NNMTPC.pdfDe-cuong-on-tap-NNMTPC.pdf
De-cuong-on-tap-NNMTPC.pdfAnhTVit1
 
Storedprocedure 140411073406-phpapp02
Storedprocedure 140411073406-phpapp02Storedprocedure 140411073406-phpapp02
Storedprocedure 140411073406-phpapp02huynhtrong774129
 
Cấu hình và bảo mật cho Ubuntu Server
Cấu hình và bảo mật cho Ubuntu Server Cấu hình và bảo mật cho Ubuntu Server
Cấu hình và bảo mật cho Ubuntu Server Ho Quang Thanh
 
Trần Anh Khoa - Kautilya và Powershell trong kỹ thuật tấn công tiếp cận
Trần Anh Khoa - Kautilya và Powershelltrong kỹ thuật tấn công tiếp cậnTrần Anh Khoa - Kautilya và Powershelltrong kỹ thuật tấn công tiếp cận
Trần Anh Khoa - Kautilya và Powershell trong kỹ thuật tấn công tiếp cậnSecurity Bootcamp
 
Technical note playframework_documentation_working with play - java_vn
Technical note playframework_documentation_working with play - java_vnTechnical note playframework_documentation_working with play - java_vn
Technical note playframework_documentation_working with play - java_vnAsahina Infotech
 

Similar to itlchn 20 - Kien truc he thong chung khoan - Phan 2 (20)

Qtu.vn sql - chuong 7
Qtu.vn  sql - chuong 7Qtu.vn  sql - chuong 7
Qtu.vn sql - chuong 7
 
120 cau mon quan tri mang public_sv
120 cau mon quan tri mang public_sv120 cau mon quan tri mang public_sv
120 cau mon quan tri mang public_sv
 
Morden data center technology
Morden data center technologyMorden data center technology
Morden data center technology
 
Bao cao thuc tap tuan 1 Athena Tran Dang Khoa
Bao cao thuc tap tuan 1 Athena Tran Dang KhoaBao cao thuc tap tuan 1 Athena Tran Dang Khoa
Bao cao thuc tap tuan 1 Athena Tran Dang Khoa
 
Tích hợp microsoft lync, asterisk va skype
Tích hợp microsoft lync, asterisk va skypeTích hợp microsoft lync, asterisk va skype
Tích hợp microsoft lync, asterisk va skype
 
Server chuc nang.pptx
Server chuc nang.pptxServer chuc nang.pptx
Server chuc nang.pptx
 
Server chuc nang.pptx
Server chuc nang.pptxServer chuc nang.pptx
Server chuc nang.pptx
 
Bai bao cao 3
Bai bao cao 3Bai bao cao 3
Bai bao cao 3
 
Chuan viet code va thiet ke giao dien trong C#
Chuan viet code va thiet ke giao dien trong C#Chuan viet code va thiet ke giao dien trong C#
Chuan viet code va thiet ke giao dien trong C#
 
Đề tài: Dòng PLC hoạt động vô cùng hiệu quả công việc, HOT
Đề tài: Dòng PLC hoạt động vô cùng hiệu quả công việc, HOTĐề tài: Dòng PLC hoạt động vô cùng hiệu quả công việc, HOT
Đề tài: Dòng PLC hoạt động vô cùng hiệu quả công việc, HOT
 
Cấu trúc hệ điều hành
Cấu trúc hệ điều hànhCấu trúc hệ điều hành
Cấu trúc hệ điều hành
 
Báo cáo tuần 1 nguyen phuong nhung
Báo cáo tuần 1 nguyen phuong nhungBáo cáo tuần 1 nguyen phuong nhung
Báo cáo tuần 1 nguyen phuong nhung
 
php với oracle database
php với oracle databasephp với oracle database
php với oracle database
 
De-cuong-on-tap-NNMTPC.pdf
De-cuong-on-tap-NNMTPC.pdfDe-cuong-on-tap-NNMTPC.pdf
De-cuong-on-tap-NNMTPC.pdf
 
Stored procedure
Stored procedureStored procedure
Stored procedure
 
Storedprocedure 140411073406-phpapp02
Storedprocedure 140411073406-phpapp02Storedprocedure 140411073406-phpapp02
Storedprocedure 140411073406-phpapp02
 
Cấu hình và bảo mật cho Ubuntu Server
Cấu hình và bảo mật cho Ubuntu Server Cấu hình và bảo mật cho Ubuntu Server
Cấu hình và bảo mật cho Ubuntu Server
 
--De cuong on tap hdh
 --De cuong on tap hdh --De cuong on tap hdh
--De cuong on tap hdh
 
Trần Anh Khoa - Kautilya và Powershell trong kỹ thuật tấn công tiếp cận
Trần Anh Khoa - Kautilya và Powershelltrong kỹ thuật tấn công tiếp cậnTrần Anh Khoa - Kautilya và Powershelltrong kỹ thuật tấn công tiếp cận
Trần Anh Khoa - Kautilya và Powershell trong kỹ thuật tấn công tiếp cận
 
Technical note playframework_documentation_working with play - java_vn
Technical note playframework_documentation_working with play - java_vnTechnical note playframework_documentation_working with play - java_vn
Technical note playframework_documentation_working with play - java_vn
 

itlchn 20 - Kien truc he thong chung khoan - Phan 2

  • 1.  Một trong những Broker (công ty môi giới) chính trên thị trường VN  Số tài khoản khách hàng: ~100.000  Thị phần môi giới: Đứng thứ 4 trên HSX, thứ 2 trên HNX (số liệu quý 1 năm 2016)  Số lệnh đặt trong ngày: ~20.000 lệnh. Cao điểm khi thị trường nóng có thể vượt 30.000 lệnh
  • 2.  Hệ thống core: phát triển bởi FSS, một đơn vị phát triển core chứng khoán có tiếng trên thị trường Việt Nam  Một số phần trong hệ thống được phát triển hoặc nâng cấp bởi VNDS  Hệ thống hỗ trợ nhiều kênh đặt lệnh: Online, ATD/BD, BO, Bloomberg (via FIX 4.2 protocol) …
  • 3.  Hệ thống hoạt động không thật sự ổn định  Các vấn đề gặp phải: dead locking database (nhiều lúc phải restart Oracle DB của Back Office)  Gửi lặp lệnh vào sở(xảy ra vào ngày 27-08-2014 khi VNDS gửi nhiều hơn 20.000 lệnh lặp vào sàn HNX)  Khả năng xử lý của hệ thống đạt max ~10 lệnh/s, độ trễ ~4s
  • 4.  Hệ thống có khả năng xử lý ổn định 5000-10000 lệnh/s  Độ trễ hệ thống < 4ms (không tính độ trễ sinh ra do đường truyền kết nối đến sở, khoảng 70 ms đối với sở HSX) -> Mục tiêu nâng hiệu năng của hệ thống lên 1000 lần
  • 5.  Tách hoàn toàn phần xử lý lệnh khỏi BO, xây dựng một hệ thống chuyên biệt mới hoàn toàn xử lý việc này: ORS/OMS (Orders routing and management system)  Hệ thống ORS sẽ thực hiện load toàn bộ dữ liệu cần thiết từ BO vào đầu ngày giao dịch (BOD) và thực hiện xóa toàn bộ dữ liệu (reset) vào cuối ngày giao dịch (EOD)  Dữ liệu cần đồng bộ trong ngày (rút tiền, nộp tiền, mở tài khoản mới … ) sẽ được thực hiện qua hoặc web service hoặc messages push
  • 6.  Ngôn ngữ: C/C++ và Java • 90% hệ thống phát triển bằng Java (plain java, không sử dụng bất cứ framework nào) • 10% hệ thống (các modules xử lý dữ liệu thị trường và Gateways) phát triển bằng C/C++ • 100% C: May be the next version!  OS: Linux/UNIX: Lựa chọn hiển nhiên ở server side
  • 7.  Messages queues: ActiveMQ, ZeroMQ • Apache ActiveMQ: Open source về messages broker được sử dụng rộng rãi nhất hiện nay • ZeroMQ: Giải pháp opensource về messaging nhanh nhất hiện tại. Hỗ trợ Inproc, IPC, TCP, reliable multicast (PGM) …  FIX engines: QuickFiX CPP, QuickfixJ  Databases: PostgresQL  Web server: Jetty
  • 8.  Cần một tool đủ tốt để theo dõi hệ thống chạy trên môi trường production, theo thời gian thực  Cost để benchmark ~0 (hoặc vài magnitude thấp hơn cost xử lý orders của hệ thống) • Observer effect: “Measurements of certain systems cannot be made without affecting the systems” -> Tự phát triển  Performance Statistics 23:06:35  Tag Avg(us) Min Max Std Dev Count  INSERT into forward VALUES(DEFAU 97.79 62 42186 328.64 18740  Update Complex Accounts 0.20 0 1351 11.31 18761  QFJ-01 214.26 60 20778 546.56 18761  DOrder 507.66 163 53537 1011.87 18762  Performance Statistics 23:07:05  Tag Avg(us) Min Max Std Dev Count  INSERT into forward VALUES(DEFAU 82.35 66 132 13.07 1360  Update Complex Accounts 0.07 0 35 1.00 1339  QFJ-01 169.18 59 4196 374.89 1339  DOrder 366.78 162 8208 526.34 1338
  • 9.  Log4J: Quá phức tạp, quá chậm -> Chuyển sang sử dụng phiên bản customize của logback. Thực hiện tuning/test và chỉ để lại những options đảm bảo performance.  OpenJDK, Sun JDK: Chậm, độ ổn định về performance kém -> Chuyển sang dùng jrockit và sử dụng các options để tuning garbage collector
  • 10.  Hệ thống hoạt động 100% (hay gần như 100%) theo cơ chế asynchronous • No hazelcast, redis hay bất cứ giải pháp in memory data-grid nào • Hệ thống cache dữ liệu trên memory bất cứ khi nào có thể. Databases chỉ được dùng chủ yếu cho việc backup và recovery khi xảy ra sự cố cần restart hệ thống • Việc trao đổi thông tin đi và về chủ yếu được thực hiện qua các messages queues
  • 11.  Một vài con số cơ bản về communication cost (round- trip latency) • In-process (inter-threads): ~10 us • Inter-process (IPC): ~15 us • TCP/UDP on local host: ~50us • TCP/UDP on different servers: ~300 us
  • 12.  Yêu cầu bắt buộc: phải hỗ trợ chuẩn FIX (Financial Information Exchange) do đây là chuẩn giao tiếp chung của tất cả các hệ thống tài chính hiện đại  Ưu điểm của chuẩn FIX: Dễ đọc, có thể tùy ý mở rộng hoặc bổ sung thêm nghiệp vụ. Có sẵn các open source để sử dụng (QuickFIX hay QuickFixJ)  Nhược điểm: Cồng kềnh, cost để parsing messages cao
  • 13.  Viết tắt của Financial Information Exchange  Được đưa vào sử dụng từ 1992, hiện FIX protocol đã trở thành chuẩn giao tiếp chung của thế giới cho giao dịch chứng khoán điện tử  FIX protocol bao gồm: communication protocol, messages specification và business guide line
  • 14.  http://www.fixtradingcommunity.org/FIXimat e/FIXimate3.0/ FIX message sample: 8=FIX.4.4 9=221 35=D 34=33 449=ORS_1_ACTIVE 52=20151023-03:56:04.321 56=HSX_GATEWAY 57=1 11=50000018 38=10 40=2 44=73.5 54=2 55=MSN 59=0 60=20151023-03:56:04.321 453=3 448=021 447=C 452=1 448=0211 447=D 452=12 448=021C686899 447=D 452=3 10=187 HSX message sample (AutoT protocol): A!1I021021150000018021C686899MSN S10 10 73.500M C FIX message dài khoảng 200 bytes trong khi AutoT message tương ứng dài khoảng 70 bytes.
  • 15.  Các modules GWIN tiếp nhận lệnh theo FIX protocol  Các modules GWIN hoàn toàn stateless, hoạt động như các switches. Có thể dễ dàng load balancing tùy ý  Sau khi parsing message và kiểm tra các giá trị truyền vào hợp lệ, GWIN sẽ gửi các message này vào OMS
  • 16.
  • 17.  Asynchronous (gần như 100%)  Toàn bộ các tài khoản do OMS quản lý được cache trên memory  Chỉ một số orders gần nhất được cache trên memory (giá trị có thể tùy chỉnh)  Orders và các thay đổi liên quan đến tài khoản sau khi update trên memory được đẩy vào các queues để thực hiện ghi bất đồng bộ xuống DB
  • 18.  Tự xây dựng dựa trên array thuần túy  Thuật toán và implementation phần orders caching được thiết kế để không phải sử dụng bất cứ cơ chế locking nào  1 single thread sẽ quản lý việc đưa objects mới lên cache và remove objects cũ ra khỏi cache. 1 thread khác quản lý việc cập nhật các objects nằm trên cache
  • 19. Code sample:  Code unsafe: public OrderBase getOrderFromCache(int seq, OrderBase newInfo) { if (orders[seq] == null) return null; orders[seq].setField(OrderBase.CUM_QTY, newInfo.getField(OrderBase.CUM_QTY)); orders[seq].setField(OrderBase.LAST_QTY, newInfo.getField(OrderBase.LAST_QTY)); orders[seq].setField(OrderBase.LAST_PX, newInfo.getField(OrderBase.LAST_PX)); return orders[seq]; }  Code safe: public OrderBase getOrderFromCache(int seq, OrderBase newInfo) { OrderBase order = orders[seq]; if (order == null) return null; order.setField(OrderBase.CUM_QTY, newInfo.getField(OrderBase.CUM_QTY)); order.setField(OrderBase.LAST_QTY, newInfo.getField(OrderBase.LAST_QTY)); order.setField(OrderBase.LAST_PX, newInfo.getField(OrderBase.LAST_PX)); return order; }
  • 20.  Cache 100% số tài khoản (có thể sharding theo OMSs)  Tự xây dựng dựa trên array thuần túy  Thuật toán và implement phần cache tài khoản được thiết kế để giảm thiểu sử dụng locking • Thread nhận lệnh đặt/hủy/sửa và thread cập nhật trạng thái lệnh từ sở không lock lẫn nhau
  • 21.  Code unsafe class Account { private long balance; public Account(long balance) { this.balance = balance; } public boolean hold (long amount) { if (balance >= amount) { balance -= amount; return true; } return false; } public void unhold(long amount) { balance += amount; } public long getBalance() { return balance; } }
  • 22.  Tài khoản ban đầu có 10.000.000 VND. Thread 1 gọi hold 1.000.000 VND, Thread 2 gọi unhold 1.000.000 VND, vậy tài khoản cuối cùng có bao nhiêu VND? • 9.000.000 • 10.000.000 • 11.000.000 • 1 trong các khả năng trên
  • 23.  Code safe? class Account { private long balance; public Account(long balance) { this.balance = balance; } public synchronized boolean hold (long amount) { if (balance >= amount) { balance -= amount; return true; } return false; } public synchronized void unhold(long amount) { balance += amount; } public long getBalance() { return balance; } }
  • 24.
  • 25.  Code safe (như sách dạy) class Account { private volatile long balance; public Account(long balance) { this.balance = balance; } public synchronized boolean hold (long amount) { if (balance >= amount) { balance -= amount; return true; } return false; } public synchronized void unhold(long amount) { balance += amount; } public long getBalance() { return balance; } } -> Safe but awfully slow
  • 26.  Code safe class Account { private long initBalance; private long hold; private long unhold; public Account(long balance) { initBalance = balance; hold = 0; unhold = 0; } public boolean hold (long amount) { if (initBalance - hold + unhold >= amount) { hold += amount; return true; } return false; } public void unhold(long amount) { unhold += amount; } public long getBalance() { return initBalance - hold + unhold; } }
  • 27.  Trong thế giới thiết kế đa luồng, unitest có thể không hữu ích như bạn nghĩ  Xác suất xảy ra conflict giữa các threads lớn hay nhỏ? Định luật Murphy: “Anything that can possibly go wrong, does”
  • 28.  Hệ thống đã được thử load test tới khoảng 1500 lệnh/s đối với 1 OMS chạy trên 1 Linux server 4 cores.  End to end latency đo được: ~71 ms (~67 ms ping time vào sở HSX) 10:56:04.321 INFO - GWIN<--: 35=D555=11=000168689966=092815-FIXIN02-1309494=021111=092815-FIXIN02-1309-0-OrderServerATD01- ATDORS467230214461781838=1040=244=7350054=255=MSN59=060=20151023-03:56:26.10578=179=000168689980=10467=0100=150=dunguyen 10:56:04.321 INFO - Hold balance MSN, 021C686899, -10. Current balance -10 10:56:04.321 INFO - -->GW: 8=FIX.4.49=22135=D34=33449=ORS_1_ACTIVE52=20151023- 03:56:04.32156=HSX_GATEWAY57=111=5000001838=1040=244=73.554=255=MSN59=060=20151023- 03:56:04.321453=3448=021447=C452=1448=0211447=D452=12448=021C686899447=D452=310=187 10:56:04.391 INFO - <--GW: 8=FIX.4.49=32235=834=35549=HSX_GATEWAY52=20151023-03:56:04.38756=ORS_1_ACTIVE212=49213=2I21 932 231050000018231010 73.5 19104 6=011=5000001814=1017=19104 31=73.532=1037=5000001838=1039=241=5000001844=73.554=255=MSN58=2I60=20151023- 03:56:04150=3151=0453=2448=21 447=B452=1448=021C686899447=B452=310=106 10:56:04.391 INFO - Unhold balance MSN, 021C686899, -10. Current balance 0 10:56:04.392 INFO - -->GWIN FIXIN02: 35=81=00016868996=73500.011=092815-FIXIN02-1309-0-OrderServerATD01- ATDORS467230214461781814=1017=102315105604-HSX_GATEWAY-38-ORS_1_ACTIVE- 1910431=73500.032=1037=5000001838=1039=240=244=7350054=255=MSN59=060=20151023- 03:56:26.105150=F151=078=179=000168689980=10467=1100=150=dunguyen (10:56:04.319) QFIX <- 8=FIX.4.49=22135=D34=33449=ORS_1_ACTIVE52=20151023- 03:56:04.32156=HSX_GATEWAY57=111=5000001838=1040=244=73.554=255=MSN59=060=20151023- 03:56:04.321453=3448=021447=C452=1448=0211447=D452=12448=021C686899447=D452=310=187 (10:56:04.319) AutoT Send DT(3996,5382) A!1I021021150000018021C686899MSN S10 10 73.500M C (10:56:04.386) AutoT Recv DT(5382,3997) A!2I21 932 231050000018231010 73.5 19104 (10:56:04.386) QFIX -> 8=FIX.4.49=33735=834=697249=HSX_GATEWAY52=20151023-03:56:04.38756=GW_INTEGRATION_ACTIVE212=49213=2I21 932 231050000018231010 73.5 19104 6=011=932 14=171017=19104 31=73.532=1037=932 38=1039=241=932 44=73.554=155=MSN58=2I60=20151023- 03:56:04150=3151=8290453=2448=21 447=B452=1448=021C057269447=B452=310=113
  • 29.  Thank you!  Any questions? Thảm khảo thêm : http://bit.ly/itlchn-stockcore-event