Skip to content

Commit

Permalink
translate title en -> vn
Browse files Browse the repository at this point in the history
  • Loading branch information
thoainguyen committed Aug 14, 2019
1 parent d67732b commit 3026b46
Show file tree
Hide file tree
Showing 10 changed files with 19 additions and 17 deletions.
2 changes: 1 addition & 1 deletion ch1-basic/ch1-05-mem.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# 1.5. Concurrent-oriented memory model
# 1.5. Mô hình thực thi tuần tự

Thời gian đầu, CPU chỉ có một lõi duy nhất, các ngôn ngữ khi đó sẽ theo mô hình lập trình tuần tự, điển hình là ngôn ngữ C. Ngày nay, với sự phát triển của công nghệ đa xử lý, để tận dụng tối đa sức mạnh của CPU, mô hình lập trình song song hay [multi-threading](https://en.wikipedia.org/wiki/Multithreading_(computer_architecture)) thường thấy trên các ngôn ngữ lập trình ra đời. Ngôn ngữ Go cũng phát triển mô hình lập trình song song rất hiệu quả với khái niệm Goroutines.

Expand Down
2 changes: 1 addition & 1 deletion ch1-basic/ch1-06-common-concurrency-mode.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# 1.6. Concurrency Mode
# 1.6. Mô hình thực thi đồng thời

Một điểm mạnh của Golang là tích hợp sẵn cơ chế xử lý đồng thời (concurrency). Lý thuyết về hệ thống tương tranh của Go là CSP (Communicating Sequential Process) được đề xuất bởi Hoare vào năm 1978. CSP được áp dụng lần đầu cho máy tính đa dụng T9000 mà Hoare có tham gia. Từ NewSqueak, Alef, Limbo đến Golang hiện tại, Rob Pike, người có hơn 20 năm kinh nghiệm thực tế với CSP, rất quan tâm đến tiềm năng áp dụng CSP vào ngôn ngữ lập trình đa dụng. Khái niệm cốt lõi của lý thuyết CSP cũng là của lập trình concurrency trong Go: giao tiếp đồng bộ (synchronous communication). Chủ đề về giao tiếp đồng bộ đã được đề cập trong phần trước. Trong phần này chúng ta sẽ tìm hiểu sơ lược về các mẫu concurrency phổ biến trong Golang.

Expand Down
2 changes: 1 addition & 1 deletion ch1-basic/ch1-07-error-and-panic.md
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,7 @@ Do đó, khi đối mặt với giá trị error được return về, giá tr

Ngôn ngữ Go sẽ có một kiểu dữ liệu mạnh, và cụ thể chuyển đổi sẽ được thực hiện giữa những kiểu khác nhau (và sẽ phải bên dưới cùng kiểu dữ liệu). Tuy nhiên, `interface` là một ngoại lệ của ngôn ngữ Go: non-interface kiểu đến kiểu interface, hoặc chuyển đổi từ interface type là cụ thể. Nó cũng sẽ hỗ trợ ducktype, dĩ nhiên, chúng sẽ thỏa mãn cấp độ 3 về bảo mật.

## 1.7.5. Parsing Exception
## 1.7.5. Phân tích ngoại lệ

`Panic` là một hàm dựng sẵn được dùng để dừng luồng thực thi thông thường và bắt đầu `panicking`. Khi hàm `F` gọi `panic`, hàm F sẽ dừng thực thi, bất cứ hàm liên quan tới F sẽ thực thi một cách bình thường, và sau đó lệnh return F sẽ được gọi.

Expand Down
3 changes: 2 additions & 1 deletion ch3-rpc/ch3-06-grpc-ext.md
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,7 @@ func (this *Message) Validate() error {
Thông qua hàm Validate() được sinh ra, chúng có thể được kết hợp với `gRPC interceptor`, chúng ta có thể dễ dàng validate giá trị của tham số đầu vào và kết quả trả về của mỗi hàm.

## 3.6.2 REST interface

Hiện nay RESTful JSON API vẫn là sự lựa chọn hàng đầu cho các ứng dụng web hay mobile. Vì tính tiện lợi và dễ dùng của RESTful API nên chúng ta vẫn sử dụng nó để frondend có thể giao tiếp với hệ thống backend. Nhưng khi chúng ta sử dụng framework gRPC của Google để xây dựng các service. Các service sử dụng gRPC thì dễ dàng trao đổi dữ liệu với nhau dựa trên giao thức HTTP/2 và protobuf, nhưng ở phía frontend lại sử dụng [RESTful API](https://restfulapi.net/) API hoạt động trên giao thức HTTP/1. Vấn đề đặt ra là chúng ta cần phải chuyển đổi các yêu cầu RESTful API thành các yêu cầu gRPC để hệ thống các service gRPC có thể hiểu được.

Cộng đồng opensource đã hiện thực một project với tên gọi là [grpc-gateway](https://github.com/grpc-ecosystem/grpc-gateway), nó sẽ sinh ra một proxy có vai trò chuyển các yêu cầu REST HTTP thành các yêu cầu gRPC HTTP2.
Expand Down Expand Up @@ -354,7 +355,7 @@ $ protoc -I. \

File `hello.swagger.json` sẽ được sinh ra sau đó. Trong trường hợp này, chúng ta có thể dùng `swagger-ui project` để cung cấp tài liệu `REST interface` và testing dưới dạng web pages.

## 3.6.3 Docker grpc-gateway
## 3.6.3 Dùng Docker grpc-gateway
Với những lập trình viên phát triển gRPC Services trên các ngôn ngữ không phải Golang như Java, C++, ... có nhu cầu sinh ra grpc gateway cho các services của họ nhưng gặp khá nhiều khó khăn từ việc cài đặt môi trường Golang, protobuf, các lệnh generate,v,v.. Có một giải pháp đơn giản hơn đó là sử dụng Docker để xây dựng grpc-gateway theo bài hướng dẫn chi tiết sau [buildingdocker-grpc-gateway](https://medium.com/zalopay-engineering/buildingdocker-grpc-gateway-e2efbdcfe5c).

## 3.6.4 Nginx
Expand Down
2 changes: 1 addition & 1 deletion ch3-rpc/ch3-07-pbgo.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# 3.7 pbgo : Protobuf-based framework
# 3.7 Framework dựa trên Protobuf: pbgo

[Pbgo](https://github.com/chai2010/pbgo) là một framework nhỏ gọn dựa trên cú pháp mở rộng của Protobuf để sinh ra mã nguồn `REST` cho RPC service, trong phần này, chúng ta sẽ cùng tìm hiểu Pbgo.

Expand Down
2 changes: 1 addition & 1 deletion ch3-rpc/ch3-08-grpc-curl.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# 3.8 grpcurl tool
# 3.8 Công cụ grpcurl

Bản thân Protobuf đã có chức năng phản chiếu (reflection) lại file Proto của đối tượng khi thực thi. gRPC cũng cung cấp một package reflection để thực hiện các truy vấn cho gRPC service. Mặc dù gRPC có một hiện thực bằng C++ của công cụ `grpc_cli`, có thể được sử dụng để truy vấn danh sách gRPC hoặc gọi phương thức gRPC, nhưng bởi vì phiên bản đó cài đặt khá phức tạp nên ở đây chúng ta sẽ dùng công cụ `grpcurl` được hiện thực thuần bằng Golang. Phần này ta sẽ cùng tìm hiểu cách sử dụng công cụ này.

Expand Down
6 changes: 3 additions & 3 deletions ch4-web/ch4-02-router.md
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ r.PanicHandler = func(w http.ResponseWriter, r *http.Request, c interface{}) {

Hiện tại cộng đồng opensource có một web framework được rất nhiều star là [gin](https://github.com/gin-gonic/gin) sử dụng httprouter.

## 4.2.2 Principle
## 4.2.2 Nguyên lý

Cấu trúc dữ liệu được dùng bởi httprouter và nhiều routers dẫn xuất khác là Radix Tree. Người đọc có thể sẽ liên tưởng đến những cây khác như `compressed dictionary tree` và hoặc đã nghe về dictionary tree (Trie Tree).

Expand Down Expand Up @@ -239,7 +239,7 @@ Do đó, `:id` trong node là một con của string, và chỉ số vẫn chưa

Trường hợp trên rất đơn giản, một route mới có thể được chèn trực tiếp vào node từ node gốc.

### 4.2.3.3 Edge spliting
### 4.2.3.3 Tách cạnh

Tiếp theo chúng ta chèn `GET /search`, sau đó sẽ sinh ra cây split tree như hình 5.6:

Expand All @@ -265,7 +265,7 @@ Chúng tôi dùng `GET /status` và `GET /support` để chèn sum vào cây. L
</div>
<br/>

### 4.2.3.4 Subnode conflict handling
### 4.2.3.4 Xử lý xung đột ở node con

Trong trường hợp bản thân các routes chỉ là string thì sẽ không có xung đột xảy ra. Chỉ có thể dẫn tới xung đột nếu route chứa kí tự đại diện (tương tự như :id hoặc catchAll). Nó đã được đề cập từ trước.

Expand Down
2 changes: 1 addition & 1 deletion ch4-web/ch4-03-middleware.md
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,7 @@ Một cách đơn giản, quá trình này thực hiện đưa vào một hàm v

Phần hiện thực hàm ở trên có thể khiến chúng ta khó hiểu.

## 4.3.3 More elegant middleware writing
## 4.3.3 Cách viết middleware thanh lịch hơn

Trong phần trước, sự tách biệt về mã nguồn hàm business và non-business function được giải quyết, nhưng cũng không tốt hơn lắm, Nếu bạn cần phải thay đổi thứ tự của những hàm đó, hoặc thêm, hoặc xóa middleware vẫn còn một số khó khăn, phần này chúng ta sẽ thực hiện việc tối ưu bằng cách viết .

Expand Down
5 changes: 3 additions & 2 deletions ch4-web/ch4-08-interface-and-web.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# 4.8 Interface và Table Driven Development
# 4.8 Interface và Table Driven Development

Trong dự án web, bạn sẽ thường bắt gặp sự thay đổi từ môi trường phụ thuộc bên ngoài, như là:

Expand Down Expand Up @@ -238,7 +238,8 @@ Do đó, interface có thể được xem như là một cách an toàn để ki

## 4.8.5 Table Driven Development

Nếu trong hàm có sử dụng `if` hoặc `switch` thì sẽ làm phức tạp hơn. Có cách
Nếu trong hàm có sử dụng `if` hoặc `switch` thì sẽ làm phức tạp hơn. Cách khác:

```go
func entry() {
var bi BusinessInstance
Expand Down
10 changes: 5 additions & 5 deletions ch4-web/ch4-09-gated-launch.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# 4.9 Grayscale Publishing and A/B test
# 4.9 Grayscale Publishing và kiểm định A/B

Những công ty có tầm cỡ trung bình thường cung cấp dịch vụ cho hàng triệu users, trong khi hệ thống của các công ty lớn sẽ phải phục vụ cho chục triệu, thậm chí hàng tỉ users. Đầu vào của những requests từ các hệ thống lớn thường bất tận, và bất cứ thay đổi nào cũng sẽ được cảm nhận từ người dùng cuối. Ví dụ, nếu hệ thống của bạn từ chối một số upstream requests trên đường xử lý, nguyên nhân đến từ hệ thống của bạn và nó không có tính chịu lỗi, sau đó lỗi sẽ được ném ra đến người dùng cuối. Tạo thành một thiệt hại thực sự đến user, loại của thiệt hại này sẽ hiển thị một pops up chứa những thông điệp lạ lẫm trên làm màn hình của user app. Do users không thể biết nó là gì, users có thể quên nó đi, bằng việc refreshing lại trang. Nhưng nó cũng làm users mất đi cơ hội mua một món hàng nào đó vì có hàng chục hoặc hàng ngàn người mua khác cùng một thời điểm, bởi vì những vấn đề nhỏ như vậy trong mã nguồn, làm mất đi lợi thế ban đầu, và mất đi cơ hội mua được món hàng yêu thích mà họ đã chờ đợi trong vài tháng. Mức độ thiệt hại mà users phải gánh chịu sẽ phụ thuộc vào tầm quan trọng của hệ thống của bạn đối với users.

Expand All @@ -11,7 +11,7 @@ Vào thời điểm này, "Grayscale release" cực kì quan trọng. Grayscale

Phương pháp đầu tiên được sử dụng nhiều trong các hàm cũ của hệ thống. Khi mà một hàm mới được đưa vào hoạt động, thì phương pháp thứ hai sẽ được dùng nhiều hơn. Dĩ nhiên, khi gây ra một số thay đổi chính đến những hàm cũ mà chúng quan trọng, thì thông thường sẽ tốt hơn nếu publish chúng theo business rules, bởi vì độ rủi ro khi mở tất cả các hàm cho người dùng là khá lớn.

## 4.9.1 Implementing grayscale publishing through batch deployment
## 4.9.1 Hiện thực grayscale publishing bằng cách deployment theo nhóm

Nếu service được deploy trên 15 instanses (có thể là physical machines hoặc containers), chúng ta chia 15 instances thành nhóm theo thứ tự độ ưu tiên, sẽ có 1-2-4-8 machines, mỗi thời điểm. Khi mở rộng ra, số lượng tăng gấp đôi.

Expand All @@ -32,7 +32,7 @@ Khi đi vào hoạt động, cách hiệu quả nhất để quan sát là nhìn

Nếu có một trường hợp bất thường, việc làm đầu tiên là roll back.

## 4.9.2 Grayscale publishing through business rules
## 4.9.2 Grayscale publishing thông qua business rules

Có nhiều chiến lược Grayscale phổ biến. Ví dụ, chiến lược của chúng ta là publish trong hàng ngàn points. Sau đó chúng ta có thể dùng user id, mobile phone number, user device information, v,v để sinh ra một giá trị hash.

Expand All @@ -48,7 +48,7 @@ func passed() bool {
}
```

## 4.9.2.1 Optional rules
## 4.9.2.1 Các rules tuỳ chọn

Một số hệ thống Grayscale publishing phổ biến sẽ có một số rules chọn từ:

Expand Down Expand Up @@ -175,7 +175,7 @@ func isPassed(rate int) bool {

Chú ý tới khởi tạo `seed`.

### 4.9.3.2 Hash algorithm
### 4.9.3.2 Thuật toán Hash

Có nhiều thuật thoán hash như là `md5`, `crc32`, `sha1`, v,v,.. nhưng mục đích mà chúng ta hướng đến là ánh xạ những data tới key tương ứng, và ta không muốn sử dụng quá nhiều CPU cho việc tính toán hash. Đa số các thuật toán đều `murmurhash`, sau đây là kết quả benchmark cho những thuật toán hash phổ biến đó.

Expand Down

0 comments on commit 3026b46

Please sign in to comment.