Kinh nghiệm lập trình website mã nguồn mở PHP

Tìm hiểu về indexer trong magento 2

Giới thiệu

Indexing là một trong những tính năng quan trọng giúp tối ưu hóa tốc độ trong hệ thống Magento. Với vai trò là 1 người phát triển, lập trình ứng dụng Magento, chúng ta bắt buộc phải hiểu rõ chức năng này, qua đó dễ dàng điều khiển cũng như tùy biến, mở rộng indexing system.
Bài viết sẽ đề cập tới Indexer trong Magento 2

Index overview

Tìm hiểu về indexer trong magento 2
Chúng ta đã biết về khái niệm index (lập chỉ mục) hay gặp trong các thư viện, nhà sách, hay cuốn từ điển… Để hỗ trợ việc tìm kiếm thuận lợi và nhanh chóng hơn, người ta sẽ xắp xếp các cuốn sách theo thứ tự ABC hay 123, việc này đơn giản gọi là lập chỉ mục – lập phụ lục – đánh số index…
Đối với các lập trình viên có thao tác với Cơ Sở Dữ Liệu, nếu dữ liệu quá lớn việc truy xuất sẽ tốn nhiều thời gian, việc tạo index key sẽ giúp tối ưu hóa các câu truy vấn.
Trong Magento, cấu trúc dữ liệu vô cùng phức tạp với catalog, prices, users, stores… (Số lượng các table trong Magento 2 hơn 400). Vì vậy chức năng index vô cùng cần thiết để tăng tốc độ xử lý ngoài giao diện (Storefront).

Ví dụ như giá của 1 sản phẩm sẽ được tính rất phức tạp bao gồm: giá nhập vào admin, giá sau khi tính thuế, giá sau khi tính giảm giá, giảm giá thì cũng có năm bảy loại… Vậy mà chỗ nào hiện giá như danh sách sản phẩm, giỏ hàng, thanh toán… Ta lại đi tính lại ngần ấy công thức thì chết mất! Do đó index lại bảng product_price, tính toán 1 lần thôi và lưu kết quả vào đó, sau ngoài giao diện cần thì vào table đó đọc.

Khám phá Magento 2 indexer

Trong Magento có bao nhiêu indexers?

Indexer nameIndexer method nameIndexer classDescription
Category productscatalog_category_productview codeCreates category/products association
Product categoriescatalog_product_categoryview codeCreates category/products association
Product pricecatalog_product_priceview codePre-calculates product prices
Product entity attribute valuecatalog_product_attributeview codeReorganizes the EAV product structure to flat structure
Stockcataloginventory_stockview code
Catalog rule productcatalogrule_ruleview code
Catalog product rulecatalogrule_productview code
Catalog searchcatalogsearch_fulltextview code

Hầu hết các chức năng cộm cán đều được tích hợp index như product, price, eav, stock, còn có cả catalog rule chính là 1 dạng discount nữa. Đủ biết index quan trọng tới mức nào.

Indexing types

Có 2 loại index là Full reindex và Partial reindex.
• Full index tức là xây dựng lại toàn bộ các bảng data về index trong hệ thống, thường xảy ra khi ta vừa cập nhật 1 thay đổi lớn như thêm 1 store, thêm 1 nhóm khách hàng mới. Việc chạy reindex full thông qua command line:
php bin/magento indexer:reindex
• Partial reindex là chỉ reindex những dữ liệu được cập nhật, thay đổi mà thôi. Ví dụ như bạn vừa đổi giá của sản phẩm id = 001, vậy thì bạn chỉ cần reindex giá của sản phẩm 001 đó, không cần reindex toàn bộ sản phẩm, lại càng không cần chạy full reindex làm gì.

Cơ chế làm việc của Partial reindex hoàn toàn tự động như sau:
– 1. Khi admin vừa sửa giá của sản phẩm 001
– 2. Hệ thống sẽ kiểm tra cấu hình indexer tên “Product Price” có mode “Update On Save” hay không?
—- 2.1 Nếu có: Giá của product 001 trong bảng indexer sẽ được reindex ngay.
—- 2.2 Nếu không: Hệ thống sẽ ghi nhận lại ID product vào bảng changelog và đánh dấu indexer product price là “invalid” – tức sẽ được reindex theo thời gian quy định sẵn thông qua cronjob.

Indexers status

Dựa trên trạng thái của loại indexer đã được reindex hay chưa, người ta chia indexers status ra 3 loại:
• valid: dữ liệu đã được đồng bộ, không cần reindex nữa
• invalid: dữ liệu đã được thay đổi, cần được reindex
• working: quá trình reindex đang diễn ra
Mỗi indexer (trong bảng có bao nhiêu indexers bên trên) đều có 1 status riêng, Magento dựa vào các trạng thái này để quản lý các indexer. Ta có thể xem các status này thông qua:
– Admin panel menu System > New Index Management
– Command line: php bin/magento indexer:status
– Database: bảng indexer_state

Chú ý, với indexers có status là working, thì khi ta chạy command line full reindex hoặc system handle partial reindex – indexer working đó sẽ bị bỏ qua. Trường hợp hay gặp là indexer A đang working, tự dưng bị die, thế là status của nó giữ là working, và từ đó về sau indexer này bị bỏ quên luôn.
Vậy nên trước khi chạy reindex full, hoặc reindex cho 1 bảng cụ thể, ta cần check có indexers nào đang working không, nếu có phải set lại status khác.

Indexing modes

Reindexing được thực thi với 2 chế độ (mode):
• Update on Save: index sẽ được cập nhật ngay sau khi save data.
• Update by Schedule: index được cập nhật thông qua cronjob theo lịch trình cấu hình.
Ta có thể chỉnh index mode trong phần System > New Index Management
Hoặc dùng command line php bin/magento indexer:set-mode {realtime|schedule} [indexer]

Cơ chế hoạt động của mode Update by Schedule như sau:
Mỗi khi indexers được chuyển qua mode schedule, trigger trong Database sẽ tạo thêm 1 table có hậu tố (suffix) là _cl (nghĩa là changelog)
Trong code, hàm save sẽ có 1 điều kiện để check index mode, ví dụ như ta set catalog_product_price là schedule, thì khi ta update giá sản phẩm 001, trong bảng catalog_product_price_cl sẽ có data: version_id = 1, entity_id = 001
Sẽ có các Cronjob làm nhiệm vụ đọc data trong bảng changelog này, so sánh version trong bảng mview_state, và chạy reindex.

Tìm hiểu về indexer trong magento 2
Tìm hiểu về indexer trong magento 2

Custom indexer

Magento cho phép bạn áp dụng cơ chế indexers cho custom table của mình, nghĩa là bạn có table riêng, bạn chỉ cần khai báo, Magento sẽ làm nốt toàn bộ các công việc như quản lý, mode, status…index cho table đó. Tuy dễ mà lại khó, vì ta phải xử lý như thế nào trong 2 chế độ cho phù hợp, thao tác xử lý tối ưu để không ảnh hưởng toàn bộ hệ thống index mặc định. Nhất là khi chạy reindex full mà cả nhà indexers ngồi chờ cái indexer của bạn chạy mất 1 giờ đồng hồ thì toi.
Chi tiết custom index xin mời các bạn quan tâm theo dõi tại các bài hướng dẫn đầy đủ:
http://devdocs.magento.com/guides/v2.0/extension-dev-guide/indexing-custom.html
https://www.mageplaza.com/magento-2-module-development/magento-2-indexing.html

Tìm hiểu về indexer trong magento 2
Đánh giá bài viết

3 phản hồi

  1. Mình đang nghiên cứu magento 2, cảm thấy những bài viết của bạn rất hữu ích, mong bạn viết đều tay.

Gửi phản hồi

Your email address will not be published. Required fields are marked *