Bạn nhớ demo keynote của RedisConf không? Nếu có, bạn có thể thích xem phát triển hậu trường của ứng dụng bán lẻ (RedisMart) đã được trình diễn. Nếu không, đã đến lúc xem Yiftach và Ash trình bày nó. Đây là link video lại:
Bài viết này là phần đầu tiên của một chuỗi bài. Nó đưa ra một số insight về các yêu cầu chính và kiến trúc của ứng dụng bán lẻ RedisMart bằng cách xem cách bạn có thể triển khai danh mục sản phẩm, kho hàng phân tán thời gian thực, và tìm kiếm sản phẩm hỗ trợ AI. Bạn cũng sẽ thấy Redis Enterprise làm mạnh mọi chức năng đó.
Yêu Cầu
Như thường lệ trong phát triển phần mềm, hãy bắt đầu bằng thảo luận một số yêu cầu cơ bản. Dưới đây là một số user story ghi chép không chính thức:
- Là một khách hàng bán lẻ:
- Tôi muốn có truy cập nhanh (<100ms độ trễ end-to-end) đến danh mục và chi tiết sản phẩm bằng cách tìm kiếm sản phẩm dựa trên nhiều tiêu chí (ví dụ: tìm kiếm toàn văn, khoảng giá, đánh giá của khách hàng khác, hoặc tìm kiếm khía cạnh). Thời gian phản hồi cao dẫn đến tỷ lệ bounce cao.
- Nếu tôi không biết thương hiệu sản phẩm hoặc muốn thứ gì đó tương tự như những gì tôi đã mua trước, tôi muốn mua sắm sản phẩm bằng hình ảnh. Sẽ tuyệt vời nếu tìm được máy ảnh khớp gần hoặc nhìn tương tự như những gì tôi có.
- Tôi muốn có giao hàng an toàn hoặc có thể mua trực tuyến và lấy tại cửa hàng hoặc vỉa hè (click and collect).
- Là một quản lý kho:
- Tôi cần có cái nhìn chính xác, thời gian thực về kho hàng để cung cấp trải nghiệm fulfillment vượt trội cho khách hàng.
- Tôi muốn tối ưu hóa kho để giữ mặt hàng nhu cầu cao luôn có sẵn và giảm hàng tồn kho chậm bán.
- Tôi cần cái nhìn gần như thời gian thực về kho hàng trên các cửa hàng và/hoặc trung tâm fulfillment khác nhau để tối ưu hóa tồn kho.
Kiến Trúc
Bây giờ chúng ta biết yêu cầu, hãy vẽ ra ý tưởng về cách Redis có thể giúp chúng ta:
- RediSearch cho phép tìm kiếm sản phẩm phong phú với bộ lọc số, tìm kiếm toàn văn, lập chỉ mục địa lý, chấm điểm và tổng hợp.
- Tính năng Active-Active của Redis Enterprise cung cấp cập nhật thời gian thực được sao chép địa lý (geo-replicated) cho các kho hàng ngay lập tức.
- RedisAI, RedisGears và RediSearch được tận dụng để xây dựng đường ống machine learning tích hợp cơ sở dữ liệu cho suy luận thời gian thực và tìm kiếm tương đồng vector.
Từ đó, không quá khó để hình dung thiết kế sau:
Các hộp xanh đại diện cho các dịch vụ. Các hộp đỏ hiển thị các cơ sở dữ liệu được sử dụng bởi các dịch vụ đó.
Chúng tôi tuân theo một số phương pháp vi dịch vụ như:
- Một kho dữ liệu cho mỗi dịch vụ: Mỗi dịch vụ có kho dữ liệu riêng, và dữ liệu được trao đổi qua giao diện dịch vụ thay vì truy cập trực tiếp kho dữ liệu của dịch vụ khác.
- Polyglot persistence (Đa ngôn ngữ lưu trữ): Mỗi dịch vụ sử dụng kho dữ liệu phù hợp nhất dựa trên yêu cầu của nó. Nói về polyglot persistence: Redis là một nền tảng dữ liệu cho phép bạn kết hợp các tính năng và mô hình dữ liệu khác nhau do các module cung cấp để xây dựng kho dữ liệu phù hợp với yêu cầu của bạn! Có thể không ngạc nhiên khi chúng tôi dùng Redis và một số module Redis để triển khai các hộp đỏ.
Triển Khai
RedisMart cung cấp giao diện người dùng được phục vụ bởi ứng dụng web web-shop. RedisMart có frontend UI (trang web bán lẻ đối mặt khách hàng) và backend UI (để quản lý kho hàng). Chúng tôi triển khai một loạt dịch vụ được tận dụng bởi ứng dụng phía sau.
- Mua hàng (Purchasing): Dịch vụ mua hàng (ngoài dự báo) xử lý việc mua của khách hàng.
- Kho hàng (Inventory): Dịch vụ kho hàng trả lời câu hỏi về lượng tồn kho trong kho, và lượng giảm khi khách hàng mua hàng. Cập nhật kho hàng được sao chép gần như thời gian thực đến kho hàng ở các vị trí khác bằng cách tận dụng tính năng Active-Active của Redis Enterprise. Redis Enterprise tận dụng các kiểu dữ liệu được sao chép không xung đột (conflict-free replicated data types) để xử lý cập nhật đồng thời. Trong trường hợp này, kiểu bộ đếm dương âm có thể reset (resettable positive negative counter) được dùng để ngăn mất mát bộ đếm.
- Danh mục sản phẩm (Product catalog): Dịch vụ danh mục sản phẩm cung cấp thông tin liên quan đến sản phẩm và cung cấp các cách tinh vi để tìm sản phẩm. Nó sử dụng một cơ sở dữ liệu Redis có triển khai module RediSearch + RedisJSON. RedisJSON cho phép lưu trữ chi tiết sản phẩm trực tiếp dưới dạng tài liệu JSON. RediSearch có thể lập chỉ mục, truy vấn và tìm kiếm toàn văn tài liệu JSON. Cập nhật sản phẩm có thể dễ dàng lan truyền trên nhiều trang web bằng cách sử dụng tính năng Active-Active của Redis Enterprise.
- Nhận dạng hình ảnh (Image recognition): Cuối cùng, dịch vụ nhận dạng hình ảnh cung cấp chức năng phục vụ mô hình AI cho tìm kiếm tương đồng vector trên hình ảnh. Nó sử dụng một cơ sở dữ liệu Redis có cài đặt module RedisGears, RedisAI và RediSearch. RedisGears cho phép xây dựng đường ống dữ liệu và thực thi nó gần nơi dữ liệu nằm. Chúng tôi tận dụng Redis AI cho phục vụ và suy luận mô hình AI. RediSearch được tận dụng để thực hiện tìm kiếm thực tế cho hình ảnh tương tự dựa trên đầu ra của mô hình AI.
Như đã đề cập trước đó, đây là bài viết đầu tiên của một chuỗi. Hãy theo dõi để tìm hiểu thêm về cách chúng tôi triển khai các dịch vụ riêng lẻ.
RedisMart
Bây giờ chúng ta đã nhìn hậu trường, hãy xem ứng dụng trông như thế nào trên sân khấu.
Trang chủ hiển thị các danh mục sản phẩm chính. Nhấp vào một danh mục sẽ kích hoạt truy vấn tìm kiếm qua dịch vụ danh mục sản phẩm bằng cách trả về 16 sản phẩm đầu tiên thuộc danh mục đó.
Trường "Tìm kiếm sản phẩm" cho phép bạn thực hiện tìm kiếm toàn văn cho sản phẩm. Nó dẫn đến trang kết quả tìm kiếm sau:
Trang kết quả tìm kiếm có hai phần: Tìm kiếm khía cạnh (Faceted search) và danh sách kết quả thực tế. Tìm kiếm khía cạnh có thể dùng để thu hẹp thêm kết quả tìm kiếm. Bạn có thể làm điều đó bằng cách lọc qua danh mục chính, danh mục con, giá và đánh giá. Chúng tôi sẽ nói về chi tiết triển khai cách tìm kiếm khía cạnh như vậy được thực hiện với RediSearch trong phần hai của chuỗi blog. Để gợi ý, hãy xem chế độ debug của RedisMart:
Như bạn thấy, thẻ (tags) và tổng hợp (aggregation) đóng vai trò.
Nhấp vào biểu tượng máy ảnh nhỏ ở góc trên bên phải cho phép bạn chụp ảnh của thứ bạn muốn tìm trong danh mục sản phẩm. bức ảnh sau của Doug không tìm thấy Doug nào khác trong cơ sở dữ liệu của chúng tôi…
…nhưng nó tìm thấy một số tai nghe một cách dễ dàng.
Giả sử bạn quyết định chọn một cặp tai nghe và muốn mua chúng. Sau khi chọn, RedisMart cho phép bạn thêm chúng vào giỏ hàng. Trong quá trình thanh toán, bạn có thể quyết định giao hàng hoặc lấy tại vị trí gần đó.
Tìm kiếm địa lý (geo-search) của RediSearch cung cấp năng lượng cho tính năng lấy hàng tại địa phương này. Chế độ debug view lại cho bạn gợi ý về cách điều này được thực hiện phía sau.
Ngay khi khách hàng hoàn tất mua hàng, dịch vụ kho hàng được kích hoạt bằng cách giảm số lượng mặt hàng trong kho. Điều này đưa chúng ta trực tiếp đến backend của ứng dụng, cho phép quản lý kho hàng. RedisMart trực quan hóa cách cập nhật kho hàng tức thì được quan sát trên từng trang web được sao chép. Một lần mua ở Mỹ (GCP us-central1) được sao chép trong nháy mắt đến Châu Âu (Azure north-europe).
Một lần nữa, chúng tôi sẽ bao quát thêm chi tiết sau. Điểm chính ở đây là bạn có thể truy cập dữ liệu từ một vị trí gần đó với độ trễ mạng rất thấp, trong khi mất mát bộ đếm được ngăn chặn khi dữ liệu được sửa đổi đồng thời trên nhiều trang web.
Bạn có thể xem ứng dụng hoạt động bằng cách xem video sau:
Tóm Tắt
Chúng tôi hy vọng bạn thích đọc phần đầu tiên của chuỗi blog về xây dựng ứng dụng bán lẻ đầy đủ tính năng với Redis. Như bạn thấy, nền tảng dữ liệu thời gian thực Redis cho phép chúng ta giải quyết các yêu cầu như truy cập tức thì (dưới 100ms end-to-end latency) đến thông tin sản phẩm bằng cách tận dụng khả năng cơ sở dữ liệu tài liệu của RediSearch + RedisJSON. Sự kết hợp của RediSearch + RedisGears + RedisAI cho phép tìm kiếm hình ảnh hỗ trợ AI để tìm sản phẩm tương tự trong danh mục sản phẩm. Ngoài ra, các tính năng như tìm kiếm khía cạnh và tìm kiếm địa lý đã được bao quát. Cuối cùng, chúng tôi đã chỉ cho bạn thấy bạn có thể dễ dàng xây dựng một kho hàng geo-replicated, thời gian thực dựa trên tính năng Active-Active của Redis Enterprise. Với tất cả những đó, nền tảng thời gian thực Redis giúp các công ty bán lẻ tác động tích cực đến trải nghiệm mua sắm tổng thể, cung cấp trải nghiệm fulfillment tốt nhất cho khách hàng, và tối ưu hóa kho hàng theo cách tiết kiệm chi phí nhất.
Bạn muốn tìm hiểu thêm về các dịch vụ riêng lẻ chúng tôi triển khai cho RedisMart? Hãy theo dõi bài viết blog tiếp theo của chuỗi!
Muốn tự thử? Đây là một số link để làm bẩn tay với Redis như một nền tảng dữ liệu thời gian thực:
- Thêm về Modules
- github.com/RediSearch
- github.com/RedisJSON
- github.com/RedisGears
- github.com/RedisAI
- Redis Enterprise Cloud
- Active-Active Geo-Distribution
Lời Cảm Ơn
Cảm ơn lớn đến tất cả những người đã đóng góp cho ứng dụng demo này:
- Yiftach Shoolman và Ash Sahu vì đã trình bày ứng dụng demo trong RedisConf
- Đội ngũ Marketing Redis (và đặc biệt là Udi Gotlieb, Ash Sahu, Doug Tidwell, và Bryson Coles) vì đóng góp danh sách yêu cầu ứng dụng demo, tổ chức RedisConf, giúp đỡ thiết kế UI và đóng góp cho bài blog này
- Đội ngũ Technical Enablement (và đặc biệt là Martin Forstner, Greg Georges, và David Maier) vì triển khai, kiểm tra, và thiết kế ứng dụng demo – và đóng góp cho bài blog này
- Đội ngũ CTO (và đặc biệt là Leibale Eidelman, Guy Korland) vì phát triển các module và dịch vụ nhận dạng hình ảnh
- Đội ngũ Quản trị Sản phẩm (và đặc biệt là Pieter Cailliau, Emmanuel Keller, Jonathan Salomon, và Amiram Mizne) vì đóng góp danh sách yêu cầu ứng dụng demo và cung cấp tính năng sản phẩm
- Và tất cả những người chúng tôi quên không nhắc ở đây
Chúng tôi muốn dâng tặng chuỗi blog này cho nhà phát triển chính của ứng dụng RedisMart, Martin Forstner. Đi kèm với nỗi buồn lớn khi chia sẻ rằng ông ấy vừa qua đời gần đây. Kiến thức, tài năng và чув hài hước của Martin không ai sánh được. Ông ấy nhiều hơn là một Kỹ sư phần mềm cho Redis – ông ấy là đồng nghiệp, đồng đội, người dẫn đường, và một người bạn. An nghỉ ngơi, Martin, chúng tôi nhớ bạn!