当前位置: 首页 > 知识库问答 >
问题:

跨微服务的CompletableFuture)

冀鸿才
2023-03-14

第1步:我想有一个CompletableFuture

步骤2:然后通过手动调用asyncFuture手动完成相同的future对象。从不同的微服务B完成(T值),该微服务B将由某个异步事件触发。

显然,微服务 A 和微服务 B 具有不同的 JVM。实际上,微服务 A 和微服务 B 是在 kubernetes 中不同 Pod 上运行的同一微服务的不同实例。

在步骤1和步骤2之间,未来的对象将存储在Redis中,微服务B可以安全地检索。

经过一些快速谷歌搜索,我想我会尝试以下几个解决方案:

1个

static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier, Executor executor)

编号: http://docs.hazelcast.org/docs/2.3/manual/html/ch09.html

2

编号: https://apacheignite.readme.io/v1.2/docs/executor-service

不确定这两种方法是否可行?还有,我想知道以前有没有人处理过类似的事情?如果是这样,如果您能与我分享您的解决方案,我将不胜感激。


共有1个答案

郎鸿
2023-03-14

关于Apache Ignite,有很多关于如何合作节点(微服务)的选项。其中之一是连续查询[1],它允许侦听缓存上发生的数据修改。

例如,在服务A上,您可以创建ContinuousQuery并等待缓存中的值更改:

private String waitForValueChanged(IgniteCache<Integer, String> cache, Integer key) throws InterruptedException {
    ContinuousQuery<Integer, String> qry = new ContinuousQuery<>();

    qry.setInitialQuery(new ScanQuery<>((k, v) -> k == key));

    final CountDownLatch waitForValueChanged = new CountDownLatch(1);
    final AtomicReference<String> result = new AtomicReference<>();

    CacheEntryUpdatedListener<Integer, String> listener = new CacheEntryUpdatedListener<Integer, String>() {
        @Override public void onUpdated(Iterable<CacheEntryEvent<? extends Integer, ? extends String>> iterable) throws CacheEntryListenerException {
            for (CacheEntryEvent<? extends Integer, ? extends String> entry: iterable) {
                result.set(entry.getValue());
            }

            waitForValueChanged.countDown();
        }
    };

    qry.setLocalListener(listener);

    try (QueryCursor<Cache.Entry<Integer, String>> cur = cache.query(qry);) {
        waitForValueChanged.await(60000, TimeUnit.MILLISECONDS);
    }

    return result.get();
}

在服务B上,您只需要将值放入缓存中以“完成未来”:

private void completeFuture(IgniteCache<Integer, String> cache, Integer key, String value) {
    cache.put(key, value);
}

这是一个示例项目,展示了连续查询的工作原理[2]。

[1] https://apacheignite.readme.io/docs#section-连续查询

[2] https://github.com/gromtech/ignite-continuous-query-example

 类似资料:
  • 假设我们有一个用户、Wallet REST微服务和一个将事情粘合在一起的API网关。当Bob在我们的网站注册时,我们的API网关需要通过用户微服务创建一个用户,通过钱包微服务创建一个钱包。 下面是一些可能出错的场景: > 用户Bob创建失败:没关系,我们只需向Bob返回一个错误消息。我们使用的是SQL事务,所以没有人在系统中看到Bob。一切都很好:) 创建了用户Bob,但在创建钱包之前,我们的AP

  • 虽然每个微服务通常都有自己的数据,但某些实体需要在多个服务之间保持一致。 对于高度分布式环境(如微服务体系结构)中的这种数据一致性要求,设计的选择是什么?当然,我不想要共享数据库体系结构,即单个数据库管理所有服务的状态。这违反了孤立和不共享的原则。 我明白,微服务可以在创建、更新或删除实体时发布事件。对该事件感兴趣的所有其他微服务可以相应地更新各自数据库中的链接实体。 这是可行的,但是它会导致跨服

  • 我知道最好使用 Saga 模式,但想想还是很有趣的: < Li > 2PC/XA分布式事务是否提供了仅从一个应用程序和一个TM与多个RM进行事务的可能性? < li >如果没有-如果每个微服务只能访问自己的数据库,如何在多个微服务之间使用2PC/XA分布式事务来提供使用2PC的能力?我很乐意看到一个例子 < li >我们是否需要将TransactionManager服务作为一个独立的微服务,在多个

  • 假设有两个微服务:订单和库存。order service中有一个API,它接受< code>ProductId 、< code>Qty等并下订单。 理想情况下,只有在库存服务中存在库存时才允许下订单。人们建议使用Saga模式或任何其他分布式事务。这很好,最终将利用一致性。 但是如果有人想滥用这个系统。他可以使用无效或缺货的产品(< code>ProductId)推送订单。系统将接受所有这些订单,并

  • 我不清楚如何取回购买服务不保存的数据--例如:用户的全名。当试图通过购买用户名进行更复杂的搜索购买时,问题会变得更严重。 我认为,显然可以通过在两个服务之间同步用户来解决这个问题,方法是在用户创建时广播某种类型的事件(并在购买服务端只保存相关的用户属性)。在我看来,这远非理想。当你有数百万用户时,你如何处理这个问题?您会在每个使用用户数据的服务中创建数百万条记录吗? 另一个明显的选择是在用户服务端

  • 本文向大家介绍spring Cloud微服务跨域实现步骤,包括了spring Cloud微服务跨域实现步骤的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了spring Cloud微服务跨域实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 第一步:在gateway网关的配置文件中加上下面这些: 第二步:写一个配置类解析上面的配置文