
Chúng tôi là bộ phận phát triển công nghệ của một mạng lưới bán lẻ. Một ngày nọ, ban quản lý đặt ra nhiệm vụ tăng tốc độ tính toán quy mô lớn bằng cách sử dụng Apache Ignite kết hợp với MSSQL và hiển thị một trang web có các hình minh họa và ví dụ đẹp mắt về mã Java. Tôi ngay lập tức thích trang web , phần mô tả hứa hẹn những điều kỳ diệu: bạn không cần phải triển khai mã Java hoặc Scala theo cách thủ công trên mỗi nút trong lưới và triển khai lại mã đó mỗi khi mã thay đổi. Khi công việc tiến triển, hóa ra Zero Deployment có những cách sử dụng cụ thể, những tính năng mà tôi muốn chia sẻ. Bên dưới phần cắt là những suy nghĩ và chi tiết thực hiện.
1. Phát biểu vấn đề
Bản chất của nhiệm vụ là như sau. Có một thư mục SalesPoint về các điểm bán hàng và một thư mục sản phẩm Sku (Đơn vị lưu kho). Điểm bán hàng có thuộc tính “Loại cửa hàng” với các giá trị “nhỏ” và “lớn”. Một loại (danh sách các sản phẩm của điểm bán hàng) được kết nối với từng điểm bán hàng (được tải từ DBMS) và thông tin được cung cấp rằng kể từ ngày được chỉ định, sản phẩm được chỉ định
bị loại khỏi danh mục hoặc được thêm vào danh mục.
Cần phải tổ chức một bộ nhớ đệm được phân vùng của các điểm bán hàng và lưu trữ trong đó thông tin về các sản phẩm được kết nối trước một tháng. Khả năng tương thích với hệ thống chiến đấu yêu cầu nút Máy khách Ignite tải dữ liệu, tính toán tổng hợp có dạng (Loại cửa hàng, Mã sản phẩm, ngày, số_điểm_bán hàng) và tải nó trở lại DBMS.
2. Nghiên cứu văn học
Tôi chưa có kinh nghiệm nên tôi bắt đầu nhảy từ bếp lò. Đó là, từ việc xem xét các ấn phẩm.
Điều 2016 chứa một liên kết đến tài liệu của dự án Apache Ignite, đồng thời khiển trách sự mơ hồ của tài liệu này. Tôi đọc lại nó một vài lần, không có sự rõ ràng. Tôi tham khảo hướng dẫn chính thức Mà
hứa hẹn một cách lạc quan “Bạn sẽ thành công và hoạt động nhanh chóng!” Tôi đang tìm hiểu các cài đặt biến môi trường, xem hai video Apache Ignite Essentials, nhưng chúng không hữu ích lắm cho nhiệm vụ cụ thể của tôi. Mình khởi chạy thành công Ignite từ dòng lệnh với file chuẩn “example-ignite.xml”, xây dựng ứng dụng đầu tiên sử dụng Maven. Ứng dụng này hoạt động và sử dụng Zero Deployment, thật tuyệt vời!
Tôi đọc thêm và ở đó, ví dụ ngay lập tức sử dụng affinityKey (được tạo trước đó thông qua truy vấn SQL) và thậm chí sử dụng BinaryObject bí ẩn:
IgniteCache<BinaryObject, BinaryObject> people
= ignite.cache("Person").withKeepBinary(); đọc : định dạng nhị phân - giống như sự phản chiếu, truy cập vào các trường của một đối tượng theo tên. Có thể đọc giá trị của một trường mà không cần giải tuần tự hóa hoàn toàn đối tượng (tiết kiệm bộ nhớ). Nhưng tại sao BinaryObject lại được sử dụng thay vì Person, vì không có Triển khai? Tại sao lại đốt cháyCache được chuyển sang IgniteCache ? Vẫn chưa rõ ràng.
Tôi đang làm lại Ứng dụng Điện toán cho phù hợp với trường hợp của mình. Khóa chính của thư mục điểm bán hàng trong MSSQL được xác định là [id] [int] NOT NULL, tôi tạo cache bằng cách tương tự
IgniteCache<Integer, SalesPoint> salesPointCache=ignite.cache("spCache")Trong cấu hình xml tôi chỉ ra rằng bộ nhớ đệm đã được phân vùng
<bean class="org.apache.ignite.configuration.CacheConfiguration">
<property name="name" value="spCache"/>
<property name="cacheMode" value="PARTITIONED"/>
</bean>Việc phân vùng theo điểm bán hàng giả định rằng tổng hợp bắt buộc sẽ được xây dựng trên mỗi nút cụm cho các bản ghi salesPointCache có sẵn ở đó, sau đó nút khách hàng sẽ thực hiện phép tính tổng cuối cùng.
Tôi đang đọc hướng dẫn , Tôi làm điều đó bằng cách tương tự. Trên mỗi nút cụm tôi chạy IgniteRunnable(), đại loại như thế này:
@Override
public void run() {
SalesPoint sp=salesPointCache.get(spId);
sp.calculateSalesPointCount();
..
}Tôi thêm logic tổng hợp và tải lên rồi chạy nó trên tập dữ liệu thử nghiệm. Mọi thứ đều hoạt động cục bộ trên máy chủ phát triển.
Tôi đang khởi chạy hai máy chủ thử nghiệm. CentOsTôi chỉ định các địa chỉ IP trong default-config.xml, và thực thi nó trên từng thiết bị.
./bin/ignite.sh config/default-config.xmlCả hai nút Ignite đều đang chạy và có thể nhìn thấy nhau. Tôi chỉ định các địa chỉ được yêu cầu trong cấu hình xml của ứng dụng khách, nó khởi động, thêm nút thứ ba vào cấu trúc liên kết và ngay lập tức lại có hai nút. Nhật ký hiển thị dòng “ClassNotFoundException: model.SalesPoint”
SalesPoint sp=salesPointCache.get(spId);StackOverflow cho biết lỗi này do máy chủ gây ra. CentOs Không có lớp tùy chỉnh nào cho SalesPoint. Được rồi. Vậy còn việc "bạn không cần phải tự tay triển khai mã Java của mình trên từng nút" và vân vân thì sao? Hay "mã Java của bạn" không phải là thứ thuộc về SalesPoint?
Có lẽ tôi đã bỏ lỡ điều gì đó - tôi bắt đầu tìm kiếm lại, đọc và tìm kiếm lại. Một lúc sau tôi có cảm giác như đã đọc hết chủ đề rồi, không còn gì mới nữa. Trong khi tôi đang tìm kiếm, tôi tìm thấy một số bình luận thú vị.
, Kiến trúc sư trưởng tại GridGain Systems, trên StackOverflow, tháng 2016 năm XNUMX:
Model classes are not peer deployed, but you can use withKeepBinary() flag
on the cache and query BinaryObjects. This way you will avoid deserialization
on the server side and will not get ClassNotFoundException.Một ý kiến có thẩm quyền khác: , Giám đốc quản lý sản phẩm, GridGain Systems.
Bài viết về Habré tham khảo ba bài viết của Denis Magda: , , 2016-2017. Trong bài viết thứ hai, Denis đề xuất khởi động nút cụm thông qua MaintenanceServiceNodeStartup.jar. Bạn cũng có thể sử dụng khởi chạy với cấu hình xml và dòng lệnh, nhưng sau đó bạn cần đặt các lớp tùy chỉnh theo cách thủ công trên mỗi nút cụm được triển khai:
That's it. Start (..) node using MaintenanceServiceNodeStartup file or pass
maintenance-service-node-config.xml to Apache Ignite's ignite.sh/bat scripts.
If you prefer the latter then make sure to build a jar file that will contain
all the classes from java/app/common and java/services/maintenance directories.
The jar has to be added to the classpath of every node where the service
might be deployed.Thật vậy, đó là nó. Hóa ra, tại sao, định dạng nhị phân bí ẩn này!
3.SingleJar
Denis chiếm vị trí đầu tiên trong đánh giá cá nhân của tôi, IMHO là hướng dẫn hữu ích nhất hiện có. Trong của anh ấy Github chứa một ví dụ hoàn toàn làm sẵn về việc thiết lập các nút cụm, sẽ biên dịch mà không cần phải ngồi xổm thêm.
Tôi làm theo cách tương tự và nhận được một tệp jar duy nhất khởi chạy “nút dữ liệu” hoặc “nút máy khách” tùy thuộc vào đối số dòng lệnh. Quá trình lắp ráp bắt đầu và hoạt động. Zero Deployment đã bị đánh bại.
Việc chuyển đổi từ megabyte dữ liệu thử nghiệm sang hàng chục gigabyte dữ liệu chiến đấu cho thấy định dạng nhị phân tồn tại là có lý do. Cần phải tối ưu hóa mức tiêu thụ bộ nhớ trên các nút và đây là lúc BinaryObject tỏ ra rất hữu ích.
4. Kết luận
Lời chê trách đầu tiên gặp phải về sự mơ hồ của tài liệu dự án Apache Ignite hóa ra là công bằng; có rất ít thay đổi kể từ năm 2016. Không dễ để người mới bắt đầu lắp ráp một nguyên mẫu hoạt động dựa trên trang web và/hoặc kho lưu trữ.
Dựa trên kết quả công việc đã hoàn thành, ấn tượng là Zero Deployment hoạt động nhưng chỉ ở cấp độ hệ thống. Một cái gì đó như thế này: BinaryObject được sử dụng để dạy các nút cụm từ xa làm việc với các lớp tùy chỉnh; Không triển khai - cơ chế nội bộ
Apache Ignite tự đốt cháy và phân phối các đối tượng hệ thống trên toàn cụm.
Tôi hy vọng trải nghiệm của tôi sẽ hữu ích cho người dùng Apache Ignite mới.
Nguồn: www.habr.com
