Chào bạn, mình nghĩ khi soạn thảo cho người mới bắt đầu nên viết chỉnh chu hơn. Hy vọng bạn sẽ cập nhật lại bài viết này và viết thêm phần 2. Tiếp tục cố gắng nhé!
@ninja Cảm ơn câu hỏi của bạn, có lẽ chúng ta cần thay đổi kiến trúc, không nên update trực tiếp balance. Trong các hệ thống ngân hàng thì chúng ta không update trực tiếp cột balance, vì chúng ta cần lưu trữ lại lịch sử của những lần rút tiền. Cách giải quyết là chúng ta sẽ có một bảng là Holding chỉ để lưu giá trị số dư cần trừ của tài khoản, bảng này sẽ có cột status gồm 2 giá trị là PENDING và COMPLETED
Ví dụ tài khoản đang có current_balance = 10 triệu
Ở bước 1 khi ATM yêu cầu rút 2 triệu, nó phải được thực hiện đồng bộ, nó sẽ tạo một record trong bảng Holding với số tiền holding là 2 triệu và status là PENDING.
Khi người dùng check số dư, backend sẽ tính available_balance = current_balance - holding = 8 triệu.
Ở bước 3 sau khi ATM yêu cầu update DB async. Mặc dù DB chưa được update nhưng giá trị available_balance = current_balance - holding = 8 triệu, giá trị trả về cho người dùng luôn đúng.
Việc update DB bao gồm update available_balance = 8 triệu, status của holding là COMPLETED
2 tác vụ update phải được đặt trong 1 transaction.
Điều này đảm bảo người dùng luôn nhận được số dư chính xác.
Tất nhiên với cách tiếp cận này, chúng ta sẽ gặp một vấn đề khác là Dual Write, giải quyết vấn đề này là một bài toán khác.
Nếu có gì không hợp lý, bạn có thể hỏi mình, mình nghĩ sẽ còn nhiều vấn đề với cách tiếp cận này. 🤔
Our agency has established a reputation for recommending exceptional Escorts Service in Jaypee Greens Golf Spa Resort Hotel Greater Noida to discerning clients. We have found these professionals to be highly skilled in providing matchless erotic pleasure that helps relieve sexual frustration. The beautiful babes and lovely girls available through our service are dedicated to client satisfaction. Contact us today to experience the finest companionship Greater Noida has to offer.
@ngoctuyen cho mình hỏi thêm về câu trả lời của bạn, bước 3. Ở kịch bản 1, nếu dùng async, thì khi đó data chưa được update kịp. Và nếu vài phút sau người dùng query balance, thì sẽ đọc data ở đâu để lấy kết quả chính xác (do lúc nãy đã rút 2tr nhưng DB chính vẫn chưa được update) ?
Daily feedback teaches us what clients truly value most. We focus on creating meaningful connections through careful matching. Support teams stay ready to assist promptly. Muslim Female Escorts in Delhi delivers on promises with genuine warmth. Their presence brings a refreshing change to busy schedules.
SELECT ... WHERE ... FOR UPDATE chỉ tạo exclusive lock cho những row theo điều kiện WHERE. Nếu có transaction khác thực thi đồng thời những row khác thì nó vẫn chạy song song bình thường nhé.
Mà dùng cách này thì cẩn thận là ở điều kiện WHERE, cột cần WHERE phải có index. Nếu không có index thì DB sẽ phải quét toàn bộ bảng (Full Table Scan). Dẫn tới database sẽ khóa toàn bộ các dòng mà nó quét qua và khóa sạch cả bảng.
thanks e, comment của e chuẩn luôn. Đúng là khi dùng ENTRYPOINT ["./entrypoint.sh"] thì shell script trở thành PID 1, mà PID 1 không có default handler cho SIGTERM, đồng thời shell cũng không forward signal xuống nginx (process con). Nên khi docker stop, nginx không nhận được SIGTERM -> phải chờ hết grace period rồi bị SIGKILL
Cách dùng exec nginx -g 'daemon off;' em nói là ok: nó replace luôn process shell, biến nginx thành PID 1, nhận signal trực tiếp và graceful shutdown ngon lành. Anh sẽ cập nhật lại bài. Một lưu ý nhỏ là vì exec thay thế process nên mọi lệnh đứng sau nó trong script sẽ không chạy, nên exec luôn phải là lệnh cuối cùng (trong bài thì các bước envsubst/rm đều nằm trước nginx rồi nên ko ảnh hưởng)
The perfect companion is different for everyone. Some prefer sophistication and grace, Call Girls Ajmer while others value humor and friendliness. Share your preferences and let us help you find the ideal match.
Cho mình hỏi thêm, câu lệnh SELECT ... WHERE ... FOR UPDATE nó chỉ tạo exclusive lock cho vài row. Nếu có transaction khác thực thi đồng thời, cũng dùng câu lệnh trên nhưng ở các row khác, thì nó vẫn chạy song song bình thường phải không ?
Hi a,
Em đã follow bài viết của anh và áp dụng cách a chia sẻ frontend khá lâu rồi. Cảm ơn anh vì bài viết rất hữu ích!
Gần đây em có tăng stop_grace_period: 30s thì phát hiện container Nginx stop khá lâu và đôi khi bị kill cứng. Sau khi tìm hiểu, em nhận ra một vấn đề quan trọng:
Khi dùng ENTRYPOINT ["./entrypoint.sh"], process chính (PID 1) là shell script chứ không phải Nginx. Do đó khi Docker gửi SIGTERM để graceful shutdown, Nginx không nhận được signal → phải chờ hết grace period rồi bị SIGKILL.
Giải pháp: Trong file entrypoint.sh, nên dùng exec trước lệnh nginx như sau:
exec nginx -g 'daemon off;'
Nhờ exec, Nginx sẽ thay thế shell trở thành PID 1, nhận signal trực tiếp và graceful shutdown hoạt động tốt.
Digital fraud can be difficult to prevent, but a good start is finding the right escort service. Following recommendations from my community about a trusted Delhi Areas Escorts Service, I found myself with an escort who valued confidentiality as much as I do. Everything about the encounter was safe. Click here for more information on reliable Delhi Areas Escort Service.
Escort Service Janakpuri Escort Service in Jhandewalan Jor Bagh Escort Kailash Colony Escort Service
THẢO LUẬN
Wow bẵng đi một thời gian. Cảm ơn người ae nhiều nhé. Chúc em sức khỏe và bình an. Happy coding!
Chào bạn, mình nghĩ khi soạn thảo cho người mới bắt đầu nên viết chỉnh chu hơn. Hy vọng bạn sẽ cập nhật lại bài viết này và viết thêm phần 2. Tiếp tục cố gắng nhé!
@ninja Cảm ơn câu hỏi của bạn, có lẽ chúng ta cần thay đổi kiến trúc, không nên update trực tiếp balance. Trong các hệ thống ngân hàng thì chúng ta không update trực tiếp cột balance, vì chúng ta cần lưu trữ lại lịch sử của những lần rút tiền. Cách giải quyết là chúng ta sẽ có một bảng là Holding chỉ để lưu giá trị số dư cần trừ của tài khoản, bảng này sẽ có cột status gồm 2 giá trị là PENDING và COMPLETED Ví dụ tài khoản đang có current_balance = 10 triệu Ở bước 1 khi ATM yêu cầu rút 2 triệu, nó phải được thực hiện đồng bộ, nó sẽ tạo một record trong bảng Holding với số tiền holding là 2 triệu và status là PENDING. Khi người dùng check số dư, backend sẽ tính available_balance = current_balance - holding = 8 triệu. Ở bước 3 sau khi ATM yêu cầu update DB async. Mặc dù DB chưa được update nhưng giá trị available_balance = current_balance - holding = 8 triệu, giá trị trả về cho người dùng luôn đúng. Việc update DB bao gồm update available_balance = 8 triệu, status của holding là COMPLETED 2 tác vụ update phải được đặt trong 1 transaction. Điều này đảm bảo người dùng luôn nhận được số dư chính xác. Tất nhiên với cách tiếp cận này, chúng ta sẽ gặp một vấn đề khác là Dual Write, giải quyết vấn đề này là một bài toán khác. Nếu có gì không hợp lý, bạn có thể hỏi mình, mình nghĩ sẽ còn nhiều vấn đề với cách tiếp cận này. 🤔
Our agency has established a reputation for recommending exceptional Escorts Service in Jaypee Greens Golf Spa Resort Hotel Greater Noida to discerning clients. We have found these professionals to be highly skilled in providing matchless erotic pleasure that helps relieve sexual frustration. The beautiful babes and lovely girls available through our service are dedicated to client satisfaction. Contact us today to experience the finest companionship Greater Noida has to offer.
NGUYỄN HUY HOÀNG Software Engineer
📞 Phone: 0941 280 073
📧 Email: hhoang02052004@gmail.com
@ngoctuyen cho mình hỏi thêm về câu trả lời của bạn, bước 3. Ở kịch bản 1, nếu dùng async, thì khi đó data chưa được update kịp. Và nếu vài phút sau người dùng query balance, thì sẽ đọc data ở đâu để lấy kết quả chính xác (do lúc nãy đã rút 2tr nhưng DB chính vẫn chưa được update) ?
Daily feedback teaches us what clients truly value most. We focus on creating meaningful connections through careful matching. Support teams stay ready to assist promptly. Muslim Female Escorts in Delhi delivers on promises with genuine warmth. Their presence brings a refreshing change to busy schedules.
NGUYỄN HUY HOÀNG Software Engineer
📞 Phone: 0941 280 073
📧 Email: hhoang02052004@gmail.com
SELECT ... WHERE ... FOR UPDATE chỉ tạo exclusive lock cho những row theo điều kiện WHERE. Nếu có transaction khác thực thi đồng thời những row khác thì nó vẫn chạy song song bình thường nhé. Mà dùng cách này thì cẩn thận là ở điều kiện WHERE, cột cần WHERE phải có index. Nếu không có index thì DB sẽ phải quét toàn bộ bảng (Full Table Scan). Dẫn tới database sẽ khóa toàn bộ các dòng mà nó quét qua và khóa sạch cả bảng.
The online booking form for Delhi Escorts is quite straightforward and requires only basic information to get started with your selection process. Punjabi Bagh Escorts | Escorts in Rajendra Nagar | Rajendra Place Escorts Service | Rajouri Garden Escort | Escort in Mehrauli |
NGUYỄN HUY HOÀNG Software Engineer
📞 Phone: 0941 280 073
📧 Email: hhoang02052004@gmail.com
tôi thấy bài viết có gì đó sai sai, tôi đang sử dụng codex trong gói chatgpt plus (20$ 1 tháng), Context window 258k lận
thanks e, comment của e chuẩn luôn. Đúng là khi dùng
ENTRYPOINT ["./entrypoint.sh"]thì shell script trở thành PID 1, mà PID 1 không có default handler cho SIGTERM, đồng thời shell cũng không forward signal xuống nginx (process con). Nên khi docker stop, nginx không nhận được SIGTERM -> phải chờ hết grace period rồi bị SIGKILLCách dùng
exec nginx -g 'daemon off;'em nói là ok: nó replace luôn process shell, biến nginx thành PID 1, nhận signal trực tiếp và graceful shutdown ngon lành. Anh sẽ cập nhật lại bài. Một lưu ý nhỏ là vì exec thay thế process nên mọi lệnh đứng sau nó trong script sẽ không chạy, nên exec luôn phải là lệnh cuối cùng (trong bài thì các bước envsubst/rm đều nằm trước nginx rồi nên ko ảnh hưởng)Phải đăng nhập vào để comment. Ví dụ cứ nhét những thứ lung tung chỉ làm rối hơn chứ chẳng hiểu gì.
The perfect companion is different for everyone. Some prefer sophistication and grace, Call Girls Ajmer while others value humor and friendliness. Share your preferences and let us help you find the ideal match.
Cho mình hỏi thêm, câu lệnh SELECT ... WHERE ... FOR UPDATE nó chỉ tạo exclusive lock cho vài row. Nếu có transaction khác thực thi đồng thời, cũng dùng câu lệnh trên nhưng ở các row khác, thì nó vẫn chạy song song bình thường phải không ?
NGUYỄN HUY HOÀNG Software Engineer
📞 Phone: 0941 280 073
📧 Email: hhoang02052004@gmail.com
Hi a, Em đã follow bài viết của anh và áp dụng cách a chia sẻ frontend khá lâu rồi. Cảm ơn anh vì bài viết rất hữu ích! Gần đây em có tăng stop_grace_period: 30s thì phát hiện container Nginx stop khá lâu và đôi khi bị kill cứng. Sau khi tìm hiểu, em nhận ra một vấn đề quan trọng: Khi dùng ENTRYPOINT ["./entrypoint.sh"], process chính (PID 1) là shell script chứ không phải Nginx. Do đó khi Docker gửi SIGTERM để graceful shutdown, Nginx không nhận được signal → phải chờ hết grace period rồi bị SIGKILL. Giải pháp: Trong file entrypoint.sh, nên dùng exec trước lệnh nginx như sau: exec nginx -g 'daemon off;' Nhờ exec, Nginx sẽ thay thế shell trở thành PID 1, nhận signal trực tiếp và graceful shutdown hoạt động tốt.
NGUYỄN HUY HOÀNG Software Engineer
📞 Phone: 0941 280 073
📧 Email: hhoang02052004@gmail.com
Digital fraud can be difficult to prevent, but a good start is finding the right escort service. Following recommendations from my community about a trusted Delhi Areas Escorts Service, I found myself with an escort who valued confidentiality as much as I do. Everything about the encounter was safe. Click here for more information on reliable Delhi Areas Escort Service. Escort Service Janakpuri
Escort Service in Jhandewalan
Jor Bagh Escort
Kailash Colony Escort Service