Giaosucan's blog - Chia sẻ kiến thức theo cách bá đạo

Ticker

20/recent/ticker-posts

Saving Project Bao Su - HIệu ứng cánh bướm



F-Complex 22:30 phút tối

Một tiếng nổ vang trời, cánh cửa khoang làm việc 5.x vỡ tan, một luồng khói đen nhanh chóng tràn ngập khắp căn phòng, mọi người đều ho sặc sọa

Một toán biệt kích đeo mặt nạ phòng độc trùm kín mặt xộc vào

Đội dự án Bao Cao Su, các anh đã bị bắt… 

Mọi thứ diễn ra rất nhanh không đầy 10 phút, tất cả đều được đưa đi trong đêm…

6 h sáng , trong một căn phòng bí mật không có cửa sổ, một thanh niên trẻ tuổi bị xích trên bàn, một ngọn đèn chiếu thẳng vào mặt.

Các anh là ai và đây là đâu

Delta Fuck, lực lượng phản ứng nhanh, chuyên giải cứu dự án toàn cầu. 

Ồ tôi có nghe đến cái tên này, nhưng chưa từng gặp bất kì ai, sao lại bắt tôi?

Một người đàn ông trung niên tiến lại gần, đặt một tập hồ sơ dầy cộp trước mặt anh thanh niên.

Anh là PM của dự án. Chúng tôi có tất cả thông tin về dự án của các anh source code, các email, nội dung chat trong MS team, tài liệu architect, tất cả… Các anh đã mắc phải một sai lầm nghiêm trọng

Anh đã nghe đến khái niệm hiệu ứng cánh bướm chưa. 

Một cái đập cánh của con bướm ở Brazil có thể dẫn đến cơn lốc ở Texas.

Hitler đã từng thi vào viện Hàn Lâm nghệ thuật viên. Nếu như các giáo sư của viện Hàn Lâm không đánh trượt, ông ta đã không phục vụ cho quân đội Đức. Nếu không tham gia quân đội Đức, thì đảng quốc xã đã không được thành lập, và chiến tranh thế giới thứ 2 đâu xảy ra. 

Đó chính là “lý thuyết hỗn loạn” , một lý thuyết nghiên cứu các hệ thống vận động cực kỳ nhạy cảm với những điều kiện ban đầu.

Vậy liên quan gì đến tôi

Anh sẽ hiểu ngay thôi

Trên màn hình show lên một đoạn code

public class Singleton
{
private static Singleton instance;
public static List<UserCredential> userCredentialList { get; set; }
private Singleton() { }
public static Singleton Instance
{
get
{
if (instance == null)
{
instance = new Singleton();
}
if (userCredentialList == null)
{
userCredentialList = new List<UserCredential>();
}
return instance;
}
}
public List<UserCredential> AddCredential(UserCredential userCredential)
{
userCredentialList.Add(userCredential);
return userCredentialList;
}
}

OK đây là đoạn code sử dụng Singleton, đây là kĩ thuật chúng tôi đã sử dụng khi develop phần web API cho dự án Bao Cao Su. 

Anh biết khái niệm Lifetime của Singleton chứ

Vâng, khi một singleton object được tạo, thì chỉ duy nhất một object tồn tại cho đến khi process complete. Chúng tôi có dùng thư viện Windsor để tạo các singleton object cho từng controller.

Process cụ thể như sau

  • Khi user gọi request tới service API ví dụ /user/read chẳng hạn thì một object singleton duy nhất được tạo và tồn tại. Nếu có request /user/read tiếp theo thì vẫn sử dụng object đó. Đại loại object singleton được share giữa các request.
  • IIS server sẽ tạo ra 1 một worker process để xử lý từng request trên, sau khi request xử lý xong, worker process sẽ được release để IIS có thể free resource cho lần request tiếp theo.

Rất đúng, nhưng sau khi điều tra log, nhưng bản dump từ IIS server, chúng tôi phát hiện Windsor đã tạo nhiều Singleton controller object trong cùng một lúc khi có request. Và anh biết đó, một hệ thống hàng trăm ngàn user thì có sẽ có bao nhiêu request, bao nhiêu object được tạo ra? Server nào có thể đủ memory, lỗi memory leak sẽ xảy ra, Windsor sẽ không thể nào tạo controller object để handle process nữa. Lúc đó các process từ IIS không thể được release, khi request khác gửi tới server, process lại tiếp tục được tạo, và chả mấy chốc sẽ reach số process tối đa của IIS server.

Và tất nhiên trang web sẽ không thể xử lý request từ người dùng tiếp theo được nữa, hệ thống sụp đổ

Không thể nào tạo ra nhiều object được, chúng tôi code dùng singleton pattern rồi mà

Anh đã tính đến việc hệ thống này đang chạy đa luồng chưa, các request gửi tới đâu có tuần tự?

Một đoạn code lại hiện lên

Trời ạ tôi hiểu ra rồi, tại sao có thể sai lầm ngớ ngẩn như vậy chứ

Các anh đã sử dụng Windsor, một thư viện Dependency Injection hỗ trợ khá đầy đủ trong việc tạo các object, inject module , đó là một lựa chọn không tồi, chúng tôi chỉ thực hiện một thay đổi rất nhỏ

We change LifestyleSingleton to LifeStyle.PerWebRequest. 

Bằng cách này, Windsor sẽ tạo các object controller cho từng request và sẽ release ngay khi request finish. BTW, Chúng tôi suggest các anh nên sử dụng autofac 

Vậy nguyên nhân chỉ vì một dòng code sai thôi sao??

Đúng thế, giờ anh đã hiểu chúng tôi gọi chuyên án này là Hiệu Ứng cánh bướm rồi chứ?? 

Một sai lầm trong một đoạn code có thể dẫn tới cả hệ thống ngưng hoạt đông, một dự án bị hủy bỏ, khiến cho hơn 30 con người lâm vào cảnh mất việc làm, một business của công ty sụp đổ.

Một thay đổi nhỏ trong một đoạn code cũng có thể thay đổi toàn bộ cục diện của một dự án, chuyển từ thất bại sang thành công chỉ trong một tích tắc, và cũng thay đổi số phận của hàng trăm con người…

Đó chính là Hiệu Ứng Cánh Bướm

Đăng nhận xét

0 Nhận xét