Sử dụng Reactive

Cập nhật lúc 1709797385000

Tổ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();
  1. Hàm register để đăng ký cho hàm trả về kết quả thông thường.
  2. Hàm registerRx để đăng ký cho hàm trả về kết quả là RxOperation hoặc RxMultiple.
  3. 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.

Mục lục