Sử dụng Reactive
Cập nhật lúc 1709797385000Tổng quan
EzyPlatform được thiết kế để hạn chế sử dụng các câu lệnh join
, chính vì thế nên cần phải có một cách thức lập trình nào đó sử dụng cơ chế đa luồng để gọi lấy dữ liệu song song và sau đó tổng hợp lại để tối ưu hiệu năng, câu trả lời đó chính là Reactive.
Reactive trong EzyPlatform là một thư viện lập trình cho phép gọi các hàm xử lý đồng thời và tổng hợp dữ liệu khi tất cả các hàm đã được xử lý xong. Nói là một thư viện thì có vẻ to lớn nhưng thực chất khi sử dụng thì bạn chỉ cần quan tâm đến lớp Reactive mà thôi.
Sử dụng
Việc sử dụng Reactive có thể thông qua multiple và single.
Multiple
Multiple cho phép đăng ký các hàm xử lý được ánh xạ với một key, mục tiêu là để lấy ra kết quả khi tất cả các hàm đã được gọi xong, ví dụ:
return Reactive.multiple() .register( "mediaMap", () -> mediaIds.isEmpty() ? Collections.emptyMap() : mediaService.getMediaNameMapByIds(mediaIds) ) .register( "productPriceMap", () -> productPriceService .getProductPriceMap( productIds, currencyId ) ) .mapBegin(map -> { Map<Long, MediaNameModel> mediaMap = map.get("mediaMap"); Map<Long, ProductPriceModel> productPriceMap = map.get("productPriceMap"); return pagination.map(it -> { long productId = it.getProductId(); ProductModel product = productById.getOrDefault( productId, ProductModel.builder().build() ); ProductPriceModel price = productPriceMap.getOrDefault( productId, ProductPriceModel.ZERO ); return bookStoreModelToResponseConverter.toResponse( it, product, mediaMap.get(product.getId()), price, currencyFormat ); }); }) .blockingGet();
- Hàm
register
để đăng ký cho hàm trả về kết quả thông thường. - Hàm
registerRx
để đăng ký cho hàm trả về kết quả làRxOperation
hoặcRxMultiple
. - Hàm
blockingGet
sẽ chờ cho đến khi nào tất cả các hàm thành phần đã được thực thi xong thì nó mới chạy tiếp.
Single
Single sẽ phù hợp hơn khi bạn chỉ muốn xử lý cho một dữ liệu hoặc một danh sách các dữ liệu. Trên thực tế thì nó cũng là đối tượng wrap lại RxMultiple
để làm cho việc sử dụng Reactive
trở nên đơn giản hơn. Nên lớp này cũng sẽ ít được sử dụng, ví dụ:
Reactive.single(value) .operateItem(consumer) .blockingExecute(); List<String> actual = Reactive.single(values) .mapItem(String::valueOf) .blockingGet();
Lưu ý
Đối với các hàm đã sử dụng Reactive blocking ở bên trong thì sẽ không được đăng ký với Reactive ở bên ngoài nữa, ví dụ:public void hello() { Reactive.multiple() .register( "postTitleMap", () -> postService.getPostTitleMapByIds(postIds) ).blockingGet(); } Reactive.multiple() .register( "postTitleMap", () -> hello() )
Bởi vì Reactive sử dụng chung một thread pool duy nhất nên nếu gọi blocking ở bên trong có thể gây ra tình trạng đói thread và hàm bên ngoài có thể sẽ bị chờ mãi mãi.
Mã nguồn ví dụ
Bạn có thêm tham khảo tại đây.