mamnon76
Thành viên
- Tham gia
- 20/11/2015
- Bài viết
- 12
Trong bài viết này, chúng tôi xin nói về kiến trúc bên trong nền tảng "1COANH NGHIỆP 8" và những công nghệ được dùng khi phát triển.
Đâu là lý do mà chúng tôi cho rằng, đây là vấn đề khá hấp dẫn? Thứ nhất, bởi vì "1COANH NGHIỆP 8" là nền tảng ứng dụng rất lớn (hơn 10 triệu dòng mã nguồn) bằng C ++ (Client, Server…), JavaScript (Web-client) và gần đây có thêm Java. Các dự án lớn luôn hấp dẫn ít ra là do tính quy mô, bởi vì, có nhiều câu hỏi không được đặt nặng trong các dự án nhỏ, nhưng trong các dự án lớn như vậy sẽ được “mổ xẻ rất kỹ. Thứ hai, "1COANH NGHIỆP 8" là sản phẩm dạng "đóng gói" và liên tục được được cập nhật các phiên bản mới, do vậy, có rất ít những bài viết cho giới công nghệ về việc phát triển nền tảng này trên các trang tin. Ngoài ra, có lẽ cũng là điều thú vị, nếu như có thêm những mảng thông tin mới về một nền tảng công nghệ danh tiếng của Nga.
Nào cùng bắt đầu. Trong bài viết này, chúng tôi đưa ra tổng quan về một số công nghệ được áp dụng bên trong nền tảng, phác họa bối cảnh lớn mà không đi sâu vào việc thực thi cụ thể. Bởi vì đối với nhiều cơ chế làm việc của hệ thống có thể kéo dài thành một bài viết riêng biệt, còn đối với một số cơ chế khác thì có thể kéo dài thành cả một cuốn sách!
Để bắt đầu, cần xác định một số điều cơ bản nhất: xem nền tảng "1COANH NGHIỆP" là gì và được cấu tạo từ thành phần nào. Trả lời câu hỏi này không hề đơn giản, bởi vì thuật ngữ "Nền tảng" (tiếng Anh là Platform hoặc Frame-work) được hiểu là công cụ tạo dựng giải pháp ứng dụng, đồng thời vừa là môi trường thực hiện và cũng là công cụ lập trình. Về mặt quy ước, có thể xem xét các thành phần sau:
Ứng dụng nguyên thủy
Để tạo dựng ứng dụng nguyên thủy, chúng tôi sử dụng C++03. Trình biên dịch trong Windows được sử dụng là Microsoft Visual C++ 12 (tương thích với Windows XP), đối với Linux và Android sử dụng gcc 4.8, còn đối với iOS sử dụng CLang 5.0. Khi xây dựng nền tảng, chúng tôi sử dụng thư viện chuẩn chung dành cho tất cả hệ điều hành và trình biên dịch đó là STLPort. Giải pháp này cho phép làm giảm khả năng sai sót, đặc biệt là cho việc thực thi STL. Hiện nay, chúng tôi đang có kế hoạch chuyển sang thực thi STL được cung cấp từ CLang, bởi vì STLPort ngừng phát triển và không tương thích với C++11 trong gcc.
Mã nguồn của Server trong trường hợp này có sử dụng chung khoảng 99%, còn mã nguồn của Client là gần 95%. Hơn nữa, ngay cả nền tảng di động cũng sử dụng mã C++ và cũng rất nhiều, mặc dù tỷ lệ mã riêng có thấp hơn một chút.
Cũng như phần lớn những người sử dụng C++, chúng tôi không kỳ vọng sử dụng 100% khả năng của ngôn ngữ và các thư viện có sẵn. Chúng tôi hầu như không sử dụng Boost, và trong các khả năng của ngôn ngữ, không sử dụng việc chuyển đổi động các kiểu dữ liệu. Nhưng ngược lại chúng tôi tích cực áp dụng:
Các cấu phần
- Backend: Chứa “Nhân siêu dữ liệu” (Metadata driven) của nền tảng
- Accnt: Các đối tượng được sử dụng để phát triển các giải pháp kế toán doanh nghiệp (hệ thống tài khoản và biểu ghi kế toán)
- Bsl: Nhân thực hiện ngôn ngữ hệ thống
- Nuke: Bộ cấp phát bộ nhớ (sáng chế riêng của 1C)
- Dbeng8: Nhân cơ sở dữ liệu dạng File-server. Đây là tệp cơ sở dữ liệu đơn giản dựa trên ISAM, bao gồm bộ xử lý SQL đơn giản
- Wbase: Có các lớp (class) căn bản và các chức năng để mô tả giao diện người sử dụng Windows – các lớp cửa sổ (Windows classes), truy cập GDI…
Để đảm bảo cho tính toàn vẹn các mô-đun, toàn bộ tính năng được chia thành các cấu phần dưới dạng các thư viện động (*.dll cho Windows, *.so — cho Linux). Tổng số có khoảng 150 cấu phần, dưới đây chúng tôi sẽ mô tả một số cấu phần trong đó:
SCOM
Ở mức độ phân tách thấp hơn, có sử dụng hệ thống SCOM, có thể nói là giống với hệ tư tưởng của thư viện ATL. Đối với những ai chưa từng làm việc với ATL, chúng tôi liệt kê ngắn gọn các tính năng và đặc điểm của hệ thống này.
Đối với SCOM-class:
Các class mà có các phiên bản được tạo ra từ các cấu phần khác, cần được đăng ký trong SCOM-machine:
Sau đó, có thể tạo mẫu marco trong cấu phần khác:
Dựa trên Componet Model của SCOM, đã triển khai các lô-gic nghiệp vụ và phần giao diện của "1COANH NGHIỆP".
Giao diện người sử dụng
Nhân tiện nói về giao diện. Chúng tôi không sử dụng các điều khiển chuẩn (control) của Windows. Các phần tử điều khiển của chúng tôi được thực thi trực tiếp bằng Windows API. Đối với phiên bản Linux có lớp trung gian làm việc thông qua thư viện wxWidgets.
Thư viện các phần tử điều khiển không phụ thuộc vào các phần khác của "1COANH NGHIỆP" và chúng tôi còn sử dụng thư viện này trong một số tiện ích nhỏ bên trong.
Trong những năm phát triển 1COANH NGHIỆP, hình dạng bên ngoài của các điều khiển có thay đổi, nhưng thay đổi mang tính nguyên tắc chỉ xảy ra một lần vào năm 2009 cùng với việc phát hành phiên bản 8.2 và sự ra đời của "biểu mẫu được điều khiển". Ngoài những thay đổi của hình dạng bên ngoài, có sự thay đổi lớn nguyên tắc dàn dựng biểu mẫu và bỏ đi cách định vị các phần tử điều khiển theo hướng có lợi khi dàn dựng các phần tử theo cách flow-composition. Hơn nữa, trong mô hình mới, các phần tử điều khiển không làm việc trực tiếp với đối tượng trong mã nguồn và DTO (Data Transfer Objects) chuyên dụng.
Những thay đổi này đã cho phép tạo ra Web-client trên "1COANH NGHIỆP" mà giống như các lô-gic C++ của phần tử điều khiển trên JavaScript. Chúng tôi cố gắng duy trì sự tương đương các chức năng giữa Client mỏng và Web-client. Trong các trường hợp khi mà điều đó là không thể, ví dụ do hạn chế truy cập từ JavaScript API (khả năng làm việc với tệp rất hạn chế), chúng tôi thường xuyên thực hiện chức năng cần thiết bằng việc mở rộng trình duyệt đã viết trên C++. Vào thời điểm này, chúng tôi duy trì hỗ trợ trên các trình duyệt Internet Explorer và Microsoft Edge (Windows), Google Chrome(Windows), Firefox (Windows và Linux) và Safari (MacOS).
Ngoài ra, chúng tôi sử dụng công nghệ của các biểu mẫu được điều khiển để tạo mới giao diện các ứng dụng di động trên nền tảng 1C. Trên các thiết bị di động, việc vẽ các điều khiển được thực hiện bằng cách sử dụng các công nghệ "ruột" của hệ điều hành, nhưng đối với lô-gic dàn dựng biểu mẫu và hành vi của giao diện thì cũng sử dụng chính mã nguồn như trong nền tảng "lớn" của 1COANH NGHIỆP.
Giao diện 1C trên hệ điều hành Linux
Giao diện 1C trên thiết bị di động
Mã nguồn mở
Mặc dù chúng tôi không sử dụng thư viện chuẩn dành cho lập trình viên C++ dưới Windows (MFC, điều khiển từ WinAPI) nhưng không có nghĩa là chúng tôi viết tất cả các cấu phần. Ngoài thư viện wxWidgets đã đề cập ở trên, chúng tôi còn sử dụng thêm:
Ngoài ra, chúng tôi sử dụng phiên bản chỉnh sửa lớn Google Test và Google Mock khi tạo dựng các bản thử nghiệm.
Các thư viện cần thích ứng cho phù hợp với việc tổ chức các cấu phần trong mô hình SCOM.
Tính phổ dụng của 1C đã làm cho nền tảng trở thành một thử nghiệm tuyệt vời về công năng và độ linh hoạt của các thư viện sử dụng trong đó.
Tính đa dạng của người dùng cũng như các kịch bản sử dụng cho phép nhanh chóng phát hiện các lỗi ngay cả trong các đoạn mã nguồn ít được sử dụng nhất. Chúng tôi sửa ngay chúng và ngay lập tức cố gắng phản hồi cho tác giả, và quả thực kinh nghiệm tương tác phối hợp với các nhà phát triển trong các trường hợp cũng rất khác nhau.
Chẳng hạn những người phát triển cURL và Libetpan nhanh chóng hồi đáp cho pull-request, nhưng các bản vá, ví dụ trong OpenSSL, chúng tôi đã không thành công khi gửi phản hồi cho tác giả.
Lời kết
Trong bài viết này, chúng tôi đã trình bày một số khía cạnh chính khi phát triển nền tảng "1COANH NGHIỆP". Vì giới hạn bài viết nên chúng tôi chỉ đề cập đến một số khía cạnh mà theo chúng tôi là đáng quan tâm. Ngoài ra, có thể xem mô tả chung về các cơ chế khác nhau của nền tảng tại đây.
Nào cùng bắt đầu. Trong bài viết này, chúng tôi đưa ra tổng quan về một số công nghệ được áp dụng bên trong nền tảng, phác họa bối cảnh lớn mà không đi sâu vào việc thực thi cụ thể. Bởi vì đối với nhiều cơ chế làm việc của hệ thống có thể kéo dài thành một bài viết riêng biệt, còn đối với một số cơ chế khác thì có thể kéo dài thành cả một cuốn sách!
Để bắt đầu, cần xác định một số điều cơ bản nhất: xem nền tảng "1COANH NGHIỆP" là gì và được cấu tạo từ thành phần nào. Trả lời câu hỏi này không hề đơn giản, bởi vì thuật ngữ "Nền tảng" (tiếng Anh là Platform hoặc Frame-work) được hiểu là công cụ tạo dựng giải pháp ứng dụng, đồng thời vừa là môi trường thực hiện và cũng là công cụ lập trình. Về mặt quy ước, có thể xem xét các thành phần sau:
- liên cung Server;
- Client mỏng có thể kết nối đến Server theo HTTP và giao thức nhị phân riêng biệt;
- Client để làm việc trong kiến trúc 2 lớp với cơ sở thông tin mà được sắp xếp trên đĩa cứng hoặc thư mục mạng;
- Web-client;
- công cụ quản trị Server ứng dụng;
- môi trường tạo dựng (Bộ thiết kế);
- môi trường thực hiện đối với iOS, Android và Windows Phone (nền tảng di động 1C).
Ứng dụng nguyên thủy
Để tạo dựng ứng dụng nguyên thủy, chúng tôi sử dụng C++03. Trình biên dịch trong Windows được sử dụng là Microsoft Visual C++ 12 (tương thích với Windows XP), đối với Linux và Android sử dụng gcc 4.8, còn đối với iOS sử dụng CLang 5.0. Khi xây dựng nền tảng, chúng tôi sử dụng thư viện chuẩn chung dành cho tất cả hệ điều hành và trình biên dịch đó là STLPort. Giải pháp này cho phép làm giảm khả năng sai sót, đặc biệt là cho việc thực thi STL. Hiện nay, chúng tôi đang có kế hoạch chuyển sang thực thi STL được cung cấp từ CLang, bởi vì STLPort ngừng phát triển và không tương thích với C++11 trong gcc.
Mã nguồn của Server trong trường hợp này có sử dụng chung khoảng 99%, còn mã nguồn của Client là gần 95%. Hơn nữa, ngay cả nền tảng di động cũng sử dụng mã C++ và cũng rất nhiều, mặc dù tỷ lệ mã riêng có thấp hơn một chút.
Cũng như phần lớn những người sử dụng C++, chúng tôi không kỳ vọng sử dụng 100% khả năng của ngôn ngữ và các thư viện có sẵn. Chúng tôi hầu như không sử dụng Boost, và trong các khả năng của ngôn ngữ, không sử dụng việc chuyển đổi động các kiểu dữ liệu. Nhưng ngược lại chúng tôi tích cực áp dụng:
- STL (string, container và thuật toán);
- đa kế thừa (Multiple inheritance), cụ thể là kế thừa việc thực thi;
- template;
- exclusion;
- con trỏ thông minh (sáng chế riêng của 1C).
Các cấu phần
- Backend: Chứa “Nhân siêu dữ liệu” (Metadata driven) của nền tảng
- Accnt: Các đối tượng được sử dụng để phát triển các giải pháp kế toán doanh nghiệp (hệ thống tài khoản và biểu ghi kế toán)
- Bsl: Nhân thực hiện ngôn ngữ hệ thống
- Nuke: Bộ cấp phát bộ nhớ (sáng chế riêng của 1C)
- Dbeng8: Nhân cơ sở dữ liệu dạng File-server. Đây là tệp cơ sở dữ liệu đơn giản dựa trên ISAM, bao gồm bộ xử lý SQL đơn giản
- Wbase: Có các lớp (class) căn bản và các chức năng để mô tả giao diện người sử dụng Windows – các lớp cửa sổ (Windows classes), truy cập GDI…
Để đảm bảo cho tính toàn vẹn các mô-đun, toàn bộ tính năng được chia thành các cấu phần dưới dạng các thư viện động (*.dll cho Windows, *.so — cho Linux). Tổng số có khoảng 150 cấu phần, dưới đây chúng tôi sẽ mô tả một số cấu phần trong đó:
Việc phân chia thành nhiều cấu phần như vậy có lợi theo một số khía cạnh: - tạo điều kiện thiết kế tốt hơn, cụ thể tách biệt mã nguồn;
- từ một bộ gồm nhiều cấu phần có thể đóng gói linh hoạt để tạo thành nhiều gói sản phẩm khác nhau:
- ví dụ, cài đặt Client mỏng sẽ có wbase, nhưng không có backend;
- còn trên Server có wbase, ngược lại thì không có;
- tất nhiên, trong cả hai phương án đều có nuke và bsl.
SCOM
Ở mức độ phân tách thấp hơn, có sử dụng hệ thống SCOM, có thể nói là giống với hệ tư tưởng của thư viện ATL. Đối với những ai chưa từng làm việc với ATL, chúng tôi liệt kê ngắn gọn các tính năng và đặc điểm của hệ thống này.
Đối với SCOM-class:
- cung cấp phương thức mẫu, cho phép tạo ra các class từ cấu phần khác, cho dù chỉ biết tên gọi;
- cung cấp cơ sở hạ tầng cho các con trỏ thông minh với bộ đếm tham chiếu. Trong vòng đời của SCOM-class, không cần phải theo dõi thủ công;
- cho phép biết xem đối tượng đã thực hiện hoặc chưa thực hiện giao diện cụ thể và tự động chuyển đổi con trỏ của đối tượng thành con trỏ của giao diện;
- tạo đối tượng dịch vụ (service-object) mà luôn khả dụng thông qua phương thức get_service….
Giao diện người sử dụng
Nhân tiện nói về giao diện. Chúng tôi không sử dụng các điều khiển chuẩn (control) của Windows. Các phần tử điều khiển của chúng tôi được thực thi trực tiếp bằng Windows API. Đối với phiên bản Linux có lớp trung gian làm việc thông qua thư viện wxWidgets.
Thư viện các phần tử điều khiển không phụ thuộc vào các phần khác của "1COANH NGHIỆP" và chúng tôi còn sử dụng thư viện này trong một số tiện ích nhỏ bên trong.
Trong những năm phát triển 1COANH NGHIỆP, hình dạng bên ngoài của các điều khiển có thay đổi, nhưng thay đổi mang tính nguyên tắc chỉ xảy ra một lần vào năm 2009 cùng với việc phát hành phiên bản 8.2 và sự ra đời của "biểu mẫu được điều khiển". Ngoài những thay đổi của hình dạng bên ngoài, có sự thay đổi lớn nguyên tắc dàn dựng biểu mẫu và bỏ đi cách định vị các phần tử điều khiển theo hướng có lợi khi dàn dựng các phần tử theo cách flow-composition. Hơn nữa, trong mô hình mới, các phần tử điều khiển không làm việc trực tiếp với đối tượng trong mã nguồn và DTO (Data Transfer Objects) chuyên dụng.
Những thay đổi này đã cho phép tạo ra Web-client trên "1COANH NGHIỆP" mà giống như các lô-gic C++ của phần tử điều khiển trên JavaScript. Chúng tôi cố gắng duy trì sự tương đương các chức năng giữa Client mỏng và Web-client. Trong các trường hợp khi mà điều đó là không thể, ví dụ do hạn chế truy cập từ JavaScript API (khả năng làm việc với tệp rất hạn chế), chúng tôi thường xuyên thực hiện chức năng cần thiết bằng việc mở rộng trình duyệt đã viết trên C++. Vào thời điểm này, chúng tôi duy trì hỗ trợ trên các trình duyệt Internet Explorer và Microsoft Edge (Windows), Google Chrome(Windows), Firefox (Windows và Linux) và Safari (MacOS).
Ngoài ra, chúng tôi sử dụng công nghệ của các biểu mẫu được điều khiển để tạo mới giao diện các ứng dụng di động trên nền tảng 1C. Trên các thiết bị di động, việc vẽ các điều khiển được thực hiện bằng cách sử dụng các công nghệ "ruột" của hệ điều hành, nhưng đối với lô-gic dàn dựng biểu mẫu và hành vi của giao diện thì cũng sử dụng chính mã nguồn như trong nền tảng "lớn" của 1COANH NGHIỆP.
Giao diện 1C trên hệ điều hành Linux
Giao diện 1C trên thiết bị di động
Mã nguồn mở
Mặc dù chúng tôi không sử dụng thư viện chuẩn dành cho lập trình viên C++ dưới Windows (MFC, điều khiển từ WinAPI) nhưng không có nghĩa là chúng tôi viết tất cả các cấu phần. Ngoài thư viện wxWidgets đã đề cập ở trên, chúng tôi còn sử dụng thêm:
- cURL để làm việc với HTTP và FTP;
- OpenSSL để làm việc với mã hóa và cài đặt kết nối TLS;
- libxml2 và libxslt để phân tích XML;
- libetpan để làm việc với giao thức E-mail (POP3, SMTP, IMAP);
- mimetic để phân tích thông điệp E-mail;
- sqllite để lưu nhật ký làm việc của người sử dụng;
- ICU để quốc tế hóa.
Ngoài ra, chúng tôi sử dụng phiên bản chỉnh sửa lớn Google Test và Google Mock khi tạo dựng các bản thử nghiệm.
Các thư viện cần thích ứng cho phù hợp với việc tổ chức các cấu phần trong mô hình SCOM.
Tính phổ dụng của 1C đã làm cho nền tảng trở thành một thử nghiệm tuyệt vời về công năng và độ linh hoạt của các thư viện sử dụng trong đó.
Tính đa dạng của người dùng cũng như các kịch bản sử dụng cho phép nhanh chóng phát hiện các lỗi ngay cả trong các đoạn mã nguồn ít được sử dụng nhất. Chúng tôi sửa ngay chúng và ngay lập tức cố gắng phản hồi cho tác giả, và quả thực kinh nghiệm tương tác phối hợp với các nhà phát triển trong các trường hợp cũng rất khác nhau.
Chẳng hạn những người phát triển cURL và Libetpan nhanh chóng hồi đáp cho pull-request, nhưng các bản vá, ví dụ trong OpenSSL, chúng tôi đã không thành công khi gửi phản hồi cho tác giả.
Lời kết
Trong bài viết này, chúng tôi đã trình bày một số khía cạnh chính khi phát triển nền tảng "1COANH NGHIỆP". Vì giới hạn bài viết nên chúng tôi chỉ đề cập đến một số khía cạnh mà theo chúng tôi là đáng quan tâm. Ngoài ra, có thể xem mô tả chung về các cơ chế khác nhau của nền tảng tại đây.