使用 Spring 数据 Cassandra Reactive 与否

To use Spring data Cassandra Reactive or not

我有以下场景:

对于给定的请求,我们调用一个具有 2 组不同参数的函数。这些函数的结果被聚合并作为 Map 发送。称为 return 的函数是一个 CompletableFuture。函数最多发出 4 个 Async (Listenable Future) cassandra 查询。查询的结果按照它们发出的顺序进行处理。根据某些条件,该函数可以 return 在处理第一个查询的响应后或处理所有响应以获得所需的结果。

函数

@Async
public Map<String,Price> getPricing(String assetType,String code) {
//Issue Query 1 - Returns ListenableFuture
//Issue Query 2 
//Issue Query 3
//Issue Query 4

Query 1 result satisfies return , else continue to Query 2 , followed by 3 and 4.
}

服务

public Map<String,Price> getPrice(String assetType) {

CompletableFuture<Map<String,Price>> a = .getPrice(assetType,"A");
CompletableFuture<Map<String,Price>> b = .getPrice(assetType,"B");

//Join A and B and return the result
}

这是 Spring Webflux + Reactive Spring data cassandra 的更好候选者吗?实施方法是什么?

老实说,如果没有更多细节,很难回答。主要是查询结果必须满足什么样的条件才能停止评估和 return 结果。处理流时,条件逻辑很难。你可以做的是例如:

public Mono<Map<String, Person>> findCustomersAndGroupByName(){
    List<String> customer_id = ImmutableList.of("customer id 1", "customer id 2");

    return customerRepo
            .findAllById(customer_id)
            .filter(customer -> customer.getLastname().equals("Smith"))
            .switchIfEmpty(archivedCustomersRepo.findAllById(customer_id)) //if non of the customers has last name smith this will be evaluated
            .filter(customer -> customer.getLastname().equals("Smith"))
            .switchIfEmpty(associatedCustomersRepo.findAllById(customer_id)) //if non of the customers has last name smith this will be evaluated
            .filter(customer -> customer.getLastname().equals("Smith"))
            .collectMap(person -> person.getFirstname()) //grup by first name and return
    ;

}

这些都是反应性存储库。所以他们看起来:

public interface ArchivedCustomersRepo extends ReactiveCassandraRepository<Person, String> {}

但是你必须考虑到,为了利用反应式方法,事情必须一直是反应式的(非阻塞的)。这也意味着您的服务(我假设您在所有这些结束时有休息服务响应)必须 return 单声道,通量。

值得吗?这取决于您正在处理的业务案例。通常,如果您现有的大型应用程序,答案是否定的。因为要将你的思维方式(和你的同事)转变为大量使用 lambda 表达式所需的更多函数式编程风格,需要付出巨大的代价。我花了 2 年时间。

如果您有任何问题,请告诉我。