Skip to content

Commit

Permalink
feat(next-chapter): add link to next chapter
Browse files Browse the repository at this point in the history
  • Loading branch information
ducan-ne committed Aug 25, 2019
1 parent 4df85ed commit 3f57603
Show file tree
Hide file tree
Showing 43 changed files with 94 additions and 9 deletions.
1 change: 1 addition & 0 deletions ch1-basic/ch1-01-genesis.md
Original file line number Diff line number Diff line change
Expand Up @@ -91,3 +91,4 @@ $ go build
$ ./hello
Hello World
```
[Tiếp theo](ch1-02-hello-revolution.md)
2 changes: 2 additions & 0 deletions ch1-basic/ch1-02-hello-revolution.md
Original file line number Diff line number Diff line change
Expand Up @@ -359,3 +359,5 @@ func main() {
```

Lúc này, Go cuối cùng đã hoàn thành việc chuyển đổi từ ngôn ngữ C của kỷ nguyên đơn lõi sang một ngôn ngữ lập trình đa dụng của môi trường đa lõi trong kỷ nguyên Internet thế kỷ 21.

[Tiếp theo](ch1-03-array-string-and-slice.md)
2 changes: 2 additions & 0 deletions ch1-basic/ch1-03-array-string-and-slice.md
Original file line number Diff line number Diff line change
Expand Up @@ -476,3 +476,5 @@ a[len(a)-1] = nil
// xóa phần tử cuối cùng ra khỏi slice
a = a[:len(a)-1]
```

[Tiếp theo](ch1-04-func-method-interface.md)
2 changes: 2 additions & 0 deletions ch1-basic/ch1-04-func-method-interface.md
Original file line number Diff line number Diff line change
Expand Up @@ -561,3 +561,5 @@ Việc khởi tạo và thực thi chương trình Go luôn bắt đầu từ h
</div>

Cần lưu ý rằng trước khi hàm nào khác được thực thi thì tất cả code đều chạy trong cùng một Goroutine `main.main`, đây là thread chính của chương trình. Do đó, nếu một Goroutine khởi chạy trong hàm `main.main` thì nó chỉ có thể được thực thi sau khi vào chương trình đã thực thi xong `init`.

[Tiếp theo](ch1-05-concurrency-parallelism.md)
4 changes: 3 additions & 1 deletion ch1-basic/ch1-05-concurrency-parallelism.md
Original file line number Diff line number Diff line change
Expand Up @@ -160,4 +160,6 @@ func main() {
}
```

Ở phần tiếp theo chúng ta sẽ đi tới những ví dụ phức tạp hơn như cách xử lý race-condition trong Golang, sử dụng channel để chặn các goroutine,...
Ở phần tiếp theo chúng ta sẽ đi tới những ví dụ phức tạp hơn như cách xử lý race-condition trong Golang, sử dụng channel để chặn các goroutine,...

[Tiếp theo](ch1-06-common-concurrency-mode.md)
2 changes: 2 additions & 0 deletions ch1-basic/ch1-06-common-concurrency-mode.md
Original file line number Diff line number Diff line change
Expand Up @@ -858,3 +858,5 @@ func main() {
Khi hàm `main` kết thúc hoạt động, nó được thông báo bằng lệnh `cancel()` gọi đến Goroutine nền để thoát, do đó tránh khỏi việc leak Goroutine.

Concurrency là một chủ đề rất lớn, và ở đây chúng tôi chỉ đưa ra một vài ví dụ về lập trình concurrency rất cơ bản. Tài liệu chính thức cũng có rất nhiều cuộc thảo luận về lập trình concurrency, có khá nhiều cuốn sách thảo luận cụ thể về lập trình concurrency trong Golang. Độc giả có thể tham khảo các tài liệu liên quan theo nhu cầu của mình.

[Tiếp theo](ch1-07-error-and-panic.md)
4 changes: 3 additions & 1 deletion ch1-basic/ch1-07-error-and-panic.md
Original file line number Diff line number Diff line change
Expand Up @@ -430,4 +430,6 @@ func main {
}
```

Nhưng làm như vậy sẽ đi ngược lại với triết lý lập trình đơn giản và dễ hiểu của Go.
Nhưng làm như vậy sẽ đi ngược lại với triết lý lập trình đơn giản và dễ hiểu của Go.

[Tiếp theo](../ch2-cgo/ch2-01-quick-start.md)
2 changes: 2 additions & 0 deletions ch2-cgo/ch2-01-quick-start.md
Original file line number Diff line number Diff line change
Expand Up @@ -272,3 +272,5 @@ func SayHello(s string) {
```

Có vẻ như tất cả đều được viết bằng Go, nhưng việc triển khai từ hàm `main()` của ngôn ngữ Go đến phiên bản ngôn ngữ C đã tự động tạo ra hàm `SayHello`, rồi cuối cùng trở lại môi trường ngôn ngữ Go.

[Tiếp theo](ch2-01-quick-start.md)
2 changes: 2 additions & 0 deletions ch2-cgo/ch2-02-cgo-foundation.md
Original file line number Diff line number Diff line change
Expand Up @@ -193,3 +193,5 @@ Ví dụ các build flag sau chỉ ra rằng việc build chỉ được thực
```

Trong đó, dấu phẩy (`,`) nghĩa là ****. Khoảng trắng (` `) nghĩa là **hoặc**.

[Tiếp theo](ch2-03-type-conversion.md)
2 changes: 2 additions & 0 deletions ch2-cgo/ch2-03-type-conversion.md
Original file line number Diff line number Diff line change
Expand Up @@ -477,3 +477,5 @@ Sau đây cho thấy luồng cụ thể của thao tác chuyển đổi giữa c
</div>

Đối với các tính năng thường được sử dụng trong CGO, tác giả package [github.com/chai2010/cgo](https://github.com/chai2010/cgo), đã cung cấp các chức năng chuyển đổi cơ bản. Để biết thêm chi tiết hãy tham khảo code hiện thực.

[Tiếp theo](ch2-04-function-call.md)
2 changes: 2 additions & 0 deletions ch2-cgo/ch2-04-function-call.md
Original file line number Diff line number Diff line change
Expand Up @@ -187,3 +187,5 @@ void foo() {
```

Khi export interface của ngôn ngữ C, ta cần đảm bảo rằng các tham số hàm và kiểu giá trị trả về là kiểu "thân thiện" với C (xem lại [2.3](./ch2-03-type-conversion.md)) đồng thời giá trị trả về không được trực tiếp hoặc gián tiếp chứa con trỏ vào không gian bộ nhớ ngôn ngữ Go.

[Tiếp theo](ch2-05-internal-mechanisms.md)
2 changes: 2 additions & 0 deletions ch2-cgo/ch2-05-internal-mechanisms.md
Original file line number Diff line number Diff line change
Expand Up @@ -264,3 +264,5 @@ Toàn bộ biểu đồ luồng cuộc gọi như sau:
</div>

Trong đó, hàm `runtime.cgocallback` là chìa khóa để thực hiện cuộc gọi vượt ranh giới từ ngôn ngữ C sang Go. Chi tiết có thể được tìm thấy trong hiện thực [runtime.cgocallback.go](https://github.com/golang/go/blob/master/src/runtime/cgocallback.go)

[Tiếp theo](ch2-06-qsort.md)
2 changes: 2 additions & 0 deletions ch2-cgo/ch2-06-qsort.md
Original file line number Diff line number Diff line change
Expand Up @@ -355,3 +355,5 @@ func main() {
```

Để tránh thông tin ngữ cảnh của mảng được sắp xếp là `go_qsort_compare_info` bị sửa đổi trong quá trình sắp xếp, chúng tôi đã thực hiện lock global. Do đó, phiên bản hiện tại của hàm `qsort.Slice` không thể được thực thi đồng thời. Bạn đọc có thể thử cải tiến giới hạn này.

[Tiếp theo](ch2-07-cgo-mem.md)
2 changes: 2 additions & 0 deletions ch2-cgo/ch2-07-cgo-mem.md
Original file line number Diff line number Diff line change
Expand Up @@ -358,3 +358,5 @@ $ GODEBUG=cgocheck=0 go run main.go
Sau khi tắt `cgocheck` và chạy đoạn code trên, exception sẽ xuất hiện. Tuy nhiên, cần lưu ý rằng nếu bộ nhớ tương ứng trong ngôn ngữ C được release bởi runtime của Go, nó sẽ gây ra sự cố nghiêm trọng hơn. Giá trị mặc định của `cgocheck` là 1, tương ứng với phiên bản detection đơn giản hoá. Nếu bạn cần hàm detection đầy đủ, bạn có thể đặt `cgocheck` thành 2.

Để biết mô tả chi tiết về các hàm CGO rumtime pointer detection hãy tham khảo tài liệu chính thức của Golang: [package runtime - GoDoc](https://godoc.org/runtime#hdr-Environment_Variables).

[Tiếp theo](ch2-08-c-class.md)
2 changes: 2 additions & 0 deletions ch2-cgo/ch2-08-c-class.md
Original file line number Diff line number Diff line change
Expand Up @@ -519,3 +519,5 @@ int main() {
Bằng cách này, chúng ta có thể xây dựng một đối tượng `Int` bằng cách buộc con trỏ kiểu int thành con trỏ kiểu `Int` thay vì hàm tạo mặc định (default constructor). Bên trong hàm `Twice`, bằng cách chuyển con trỏ `this` trở lại con trỏ int trong thao tác ngược lại, giá trị kiểu int ban đầu đã có thể được parse. Tại thời điểm này, kiểu `Int` chỉ là một lớp vỏ trong thời gian biên dịch và không chiếm thêm bộ nhớ khi chạy.

Do đó, phương thức C++ cũng có thể được sử dụng cho các kiểu không phải class. C++ cho các hàm thành phần thông thường cũng có thể được liên kết với các kiểu. Chỉ có các phương thức ảo thuần túy được ràng buộc với đối tượng và đó là interface.

[Tiếp theo](ch2-09-static-shared-lib.md)
2 changes: 2 additions & 0 deletions ch2-cgo/ch2-09-static-shared-lib.md
Original file line number Diff line number Diff line change
Expand Up @@ -235,3 +235,5 @@ Nội dung của file _test_main.c sẽ không thay đổi, sau đó biên dịc
$ gcc -o a.out _test_main.c number.so
$ ./a.out
```

[Tiếp theo](ch2-10-link.md)
2 changes: 2 additions & 0 deletions ch2-cgo/ch2-10-link.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,3 +43,5 @@ Sẽ có một số lý do cho việc hỏng chuỗi get, đây là một số l
* Không có file `bc` được tìm thấy tương ứng.
* Phụ thuộc vào `custom pkg-config`: yêu cầu một số thiết lập thêm.
* Phụ thuộc vào `swig`: user chưa cài đặt `swig`, hoặc phiên bản không tương thích.

[Tiếp theo](ch2-11-ext.md)
2 changes: 2 additions & 0 deletions ch2-cgo/ch2-11-ext.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,5 @@
Thông qua CGO, bạn có thể kế thừa những phần mềm viết bằng C/C++ nổi tiếng hàng thập kỷ, có thể dùng Go để viết shared libraries trên giao diện C cho các hệ thống khác hoặc dùng mã nguồn được viết bởi Go để tích hợp tốt với các phần mềm có sẵn tạo thành một hệ sinh thái.

Bây giờ, các phần mềm chính thống thường được viết bởi ngôn ngữ C/C++. Sẽ rất nặng nề để có thể thay thế tòan bộ chúng bằng Go, do đó việc học cách chuyển đổi C/C++ sang Go bằng CGO là rất đáng cho dù bạn có là một nhà lập trình viên Go chuyên nghiệp.

[Tiếp theo](../ch3-rpc/ch3-01-rpc-intro.md)
4 changes: 3 additions & 1 deletion ch3-rpc/ch3-01-rpc-intro.md
Original file line number Diff line number Diff line change
Expand Up @@ -465,4 +465,6 @@ Kết quả vẫn là một chuỗi json :
{"id":0,"result":"hello:hello","error":null}
```

Điều đó làm việc gọi RPC service từ những ngôn ngữ khác dễ dàng hơn.
Điều đó làm việc gọi RPC service từ những ngôn ngữ khác dễ dàng hơn.

[Tiếp theo](ch3-02-pb-intro.md)
4 changes: 3 additions & 1 deletion ch3-rpc/ch3-02-pb-intro.md
Original file line number Diff line number Diff line change
Expand Up @@ -399,4 +399,6 @@ func (p *{{$root.ServiceName}}Client) {{$m.MethodName}}(
{{end}}
```

Khi plugin mới của protoc được hoàn thành, mã nguồn có thể được sinh ra mỗi khi RPC service thay đổi trong `hello.proto` file. Chúng ta có thể điều chỉnh hoặc thêm nội dung của mã nguồn được sinh ra bằng việc cập nhật template plugin.
Khi plugin mới của protoc được hoàn thành, mã nguồn có thể được sinh ra mỗi khi RPC service thay đổi trong `hello.proto` file. Chúng ta có thể điều chỉnh hoặc thêm nội dung của mã nguồn được sinh ra bằng việc cập nhật template plugin.

[Tiếp theo](ch3-03-fun-fpc.md)
2 changes: 2 additions & 0 deletions ch3-rpc/ch3-03-fun-fpc.md
Original file line number Diff line number Diff line change
Expand Up @@ -369,3 +369,5 @@ func (p *HelloService) Hello(request string, reply *string) error {
```

Theo cách này, khi client kết nối tới RPC service, chức năng login sẽ được thực hiện trước, và các service khác có thể thực thi bình thường sau khi login thành công.

[Tiếp theo](ch3-04-grpc.md)
2 changes: 2 additions & 0 deletions ch3-rpc/ch3-04-grpc.md
Original file line number Diff line number Diff line change
Expand Up @@ -451,3 +451,5 @@ func main() {
Chi tiết: [clientsub](../examples/ch3/ch3.4/4-pubsub/clientsub/main.go).

Cho đến giờ chúng ta đã hiện thực được service publishing và subscription khác mạng dựa trên gRPC. Trong phần kế tiếp chúng ta sẽ xét một số ứng dụng nâng cao hơn của Go trong gRPC.

[Tiếp theo](ch3-05-grpc-advanced.md)
2 changes: 2 additions & 0 deletions ch3-rpc/ch3-05-grpc-advanced.md
Original file line number Diff line number Diff line change
Expand Up @@ -407,3 +407,5 @@ func main() {
Bạn đọc có thể xem code chi tiết tại [đây](../examples/ch3/ch3.5/4-with-web-services/main.go).

Theo cách này chúng ta có thể cung cấp cả web serive và gRPC chung port cùng một lúc.

[Tiếp theo](ch3-06-grpc-ext.md)
4 changes: 3 additions & 1 deletion ch3-rpc/ch3-06-grpc-ext.md
Original file line number Diff line number Diff line change
Expand Up @@ -358,4 +358,6 @@ File `hello.swagger.json` sẽ được sinh ra sau đó. Trong trường hợp
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
Những phiên bản [Nginx](https://www.nginx.com/) về sau cũng đã hỗ trợ `gRPC` với khả năng register nhiều gRPC service instance giúp load balancing (cân bằng tải) dễ dàng hơn. Những extension của Nginx về gRPC là một chủ đề lớn, ở đây chúng tôi không trinhf bày hết được, các bạn có thể tham khảo các tài liệu trên trang chủ của Nginx như [ở đây](https://www.nginx.com/blog/nginx-1-13-10-grpc/).
Những phiên bản [Nginx](https://www.nginx.com/) về sau cũng đã hỗ trợ `gRPC` với khả năng register nhiều gRPC service instance giúp load balancing (cân bằng tải) dễ dàng hơn. Những extension của Nginx về gRPC là một chủ đề lớn, ở đây chúng tôi không trinhf bày hết được, các bạn có thể tham khảo các tài liệu trên trang chủ của Nginx như [ở đây](https://www.nginx.com/blog/nginx-1-13-10-grpc/).

[Tiếp theo](ch3-07-pbgo.md)
2 changes: 2 additions & 0 deletions ch3-rpc/ch3-07-pbgo.md
Original file line number Diff line number Diff line change
Expand Up @@ -288,3 +288,5 @@ $ curl localhost:8080/hello/vietnam
```

Bạn đọc có thể xem thêm các ví dụ tại [đây](https://github.com/chai2010/pbgo/blob/master/README.md).

[Tiếp theo](ch3-08-grpc-curl.md)
2 changes: 2 additions & 0 deletions ch3-rpc/ch3-08-grpc-curl.md
Original file line number Diff line number Diff line change
Expand Up @@ -145,3 +145,5 @@ $ grpcurl -plaintext -d @ localhost:1234 HelloService.HelloService/Channel
"value": "hello:vietnamese-vng"
}
```
[Tiếp theo](ch3-09-supplementary-notes.md)
2 changes: 2 additions & 0 deletions ch3-rpc/ch3-09-supplementary-notes.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
# 3.9. Lời nói thêm

Chúng ta nên đọc thêm các tài liệu và ví dụ được trang chủ [Protobuf](https://developers.google.com/protocol-buffers/)[gRPC](https://grpc.io/) cung cấp. Trong chương này chúng ta tập trung vào RPC của thư viện chuẩn Go và framework gRPC dựa trên Protobuf. Song song đó là tìm hiểu cách tự mình tùy chỉnh framework RPC. Hiện tại, cộng đồng Open source có rất nhiều framework RPC riêng biệt, cũng như các hệ thống RPC để tùy biến trên các hệ thống phân tán. Người dùng nên chọn đúng công cụ theo nhu cầu thực tế của mình.

[Tiếp theo](../ch4-web/ch4-01-introduction.md)
4 changes: 3 additions & 1 deletion ch4-web/ch4-01-introduction.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,4 +78,6 @@ Framework web của Go có thể được chia thành hai loại sau:

2. MVC class framework ([Revel](https://github.com/revel/revel), [Beego](https://github.com/astaxie/beego), [Iris](https://github.com/kataras/iris),...)

Chúng ta có thể xem thống kê các framwork web phổ biến được dùng trong cộng đồng Golang [ở đây](https://github.com/mingrammer/go-web-framework-stars/blob/master/README.md).
Chúng ta có thể xem thống kê các framwork web phổ biến được dùng trong cộng đồng Golang [ở đây](https://github.com/mingrammer/go-web-framework-stars/blob/master/README.md).

[Tiếp theo](ch4-02-router.md)
2 changes: 2 additions & 0 deletions ch4-web/ch4-02-router.md
Original file line number Diff line number Diff line change
Expand Up @@ -229,3 +229,5 @@ Node gốc bây giờ sẽ bắt đầu từ ký tự `/`, chuỗi truy vấn ph
</span>
<br/>
</div>

[Tiếp theo](ch4-03-middleware.md)
2 changes: 2 additions & 0 deletions ch4-web/ch4-03-middleware.md
Original file line number Diff line number Diff line change
Expand Up @@ -199,3 +199,5 @@ func (r *Router) Add(route string, h http.Handler) {
r.mux[route] = mergedHandler
}
```

[Tiếp theo](ch4-04-request-verification.md)
4 changes: 3 additions & 1 deletion ch4-web/ch4-04-request-verification.md
Original file line number Diff line number Diff line change
Expand Up @@ -362,4 +362,6 @@ var JwtAuthentication = func(next http.Handler) http.Handler {
}

// github: https://github.com/thoainguyen/go-hackercamp/tree/master/go-contacts
```
```

[Tiếp theo](ch4-05-database.md)
4 changes: 3 additions & 1 deletion ch4-web/ch4-05-database.md
Original file line number Diff line number Diff line change
Expand Up @@ -295,4 +295,6 @@ import (
- Phát hiện sớm các lỗi cú pháp trong câu statement.
- Có thể `cache prepared statement` và sử dụng lại sau này.
Các bạn có thể xem chi tiết hơn bài [blog](https://medium.com/zalopay-engineering/hi%E1%BB%83u-s%C3%A2u-v%E1%BB%81-prepared-statement-trong-sql-bc79d85f9b98) này.
Các bạn có thể xem chi tiết hơn bài [blog](https://medium.com/zalopay-engineering/hi%E1%BB%83u-s%C3%A2u-v%E1%BB%81-prepared-statement-trong-sql-bc79d85f9b98) này.
[Tiếp theo](ch4-06-service-flow-limitation.md)
2 changes: 2 additions & 0 deletions ch4-web/ch4-06-service-flow-limitation.md
Original file line number Diff line number Diff line change
Expand Up @@ -310,3 +310,5 @@ Mặc dù các số liệu hiệu suất là quan trọng, QoS (Quality of Servi
Nhìn chung, ta có thể cải thiện việc sử dụng CPU của các dịch vụ Web bằng cách tối ưu hóa hệ thống, từ đó tăng throughput của toàn bộ hệ thống.

Nhưng khi throughput được cải thiện, chưa chắc đã có thể cải thiện trải nghiệm người dùng. Người dùng rất nhạy cảm với độ trễ. Dù throughput của hệ thống cao, nhưng nếu không phản hồi được trong một thời gian dài sẽ làm người dùng rất khó chịu. Do đó, trong các chỉ số hiệu suất dịch vụ Web của các công ty lớn, ngoài độ trễ phản hồi trung bình, thời gian phản hồi [95% (p95) và 99% (p99)](https://stackoverflow.com/questions/12808934/what-is-p99-latency) cũng được lấy ra làm tiêu chuẩn hiệu suất. Thời gian phản hồi trung bình thường không ảnh hưởng nhiều đến việc cải thiện hiệu suất sử dụng CPU, quan trọng là thời gian phản hồi 99% so với 95% có thể tăng đáng kể. Từ đó ta có thể xem xét liệu chi phí cải thiện hiệu suất sử dụng CPU này có đáng hay không.

[Tiếp theo](ch4-07-layout-of-web-project.md)
2 changes: 2 additions & 0 deletions ch4-web/ch4-07-layout-of-web-project.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,3 +64,5 @@ Tuy nhiên, bên cạnh các yêu cầu business logic, hệ thống web còn ph
</span>
</div>
<br/>

[Tiếp theo](ch4-08-interface-and-web.md)
2 changes: 2 additions & 0 deletions ch4-web/ch4-08-interface-and-web.md
Original file line number Diff line number Diff line change
Expand Up @@ -263,3 +263,5 @@ func entry() {
`Table-driven design`, nhiều thiết kế liên quan không dùng nó như một design pattern, nhưng chúng tôi nghĩ nó vẫn có ý nghĩa quan trọng để giúp chúng ta đơn giản mã nguồn.

Dĩ nhiên, `table-driven` không phải là một lựa chọn hoàn hảo, bởi vì bạn cần tính hash từ `key`. Trong trường hợp hiệu suất là quan trọng ta cần phải cân nhắc kĩ lưỡng khi sử dụng.

[Tiếp theo](ch4-09-ext.md)
2 changes: 2 additions & 0 deletions ch4-web/ch4-09-ext.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,5 @@ Bởi vì web là một lĩnh vực khá rộng, trong chương này chúng tôi

- [Building Web Apps with Go - codegansta](https://legacy.gitbook.com/book/codegangsta/building-web-apps-with-go/details)
- [Build web application with Golang - astaxie](https://astaxie.gitbooks.io/build-web-application-with-golang)

[Tiếp theo](../ch5-cloud/ch5-01-dist-id.md)
2 changes: 2 additions & 0 deletions ch5-cloud/ch5-01-dist-id.md
Original file line number Diff line number Diff line change
Expand Up @@ -244,3 +244,5 @@ func main() {
// output:
// ID: 84989976554504193
```
[Tiếp theo](ch5-02-lock.md)
2 changes: 2 additions & 0 deletions ch5-cloud/ch5-02-lock.md
Original file line number Diff line number Diff line change
Expand Up @@ -367,3 +367,5 @@ Nếu doanh nghiệp phát triển đến một mức độ nhất định, thì
Nếu độ tin cậy của dữ liệu lock là rất cao, thì chỉ có khóa etcd hoặc ZooKeeper đảm bảo độ tin cậy của dữ liệu. Nhưng mặt trái của sự đáng tin cậy là throughput thấp hơn và latency cao hơn. Cần phải có những bài kiểm tra kỹ lưỡng theo từng cấp độ kinh doanh để đảm bảo rằng các lock phân tán bằng cụm etcd hoặc ZooKeeper có thể chịu được áp lực của các yêu cầu kinh doanh thực tế.

`Lưu ý:` sẽ không có cách nào để cải thiện hiệu suất của cụm etcd và Zookeeper bằng cách thêm các node. Để mở rộng quy mô theo chiều ngang, bạn chỉ có thể tăng số lượng cụm để hỗ trợ nhiều yêu cầu hơn. Điều này sẽ tăng thêm các chi phí vận hành, bảo trì và giám sát. Nhiều cụm có thể cần phải thêm proxy. Nếu không có proxy, dịch vụ cần được phân phối theo một ID nhất định. Nếu dịch vụ đã được mở rộng, bạn cũng nên xem xét việc di chuyển dữ liệu động. Đây không phải là điều dễ dàng.

[Tiếp theo](ch5-03-delay-job.md)
Loading

0 comments on commit 3f57603

Please sign in to comment.