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

减少流量以形成单体

谢宸
2023-03-14

我对Spring Reactive编程有点陌生。我试图从I/O得到一个Flux,然后返回一个对象列表,以及从我的服务中返回一个Mono要组合什么。

Flux<Obj1> -> Mono<Obj2>

Obj1
{
"a" : "123",
"combine" : "456"
"combine2" : "789"
}

Flux<Obj1> has multiple objects

Obj2
{
"a" : "123"
"combine" : {
              "456" : "1"
            },
"combine2" : {
               "789" : "2"
             }
}

Mono<Obj2> is a consolidation of flux with the Combiner keys.

为了实现这一点,我的初始方法是确保通量是在操作数据之后完成的。

Flux.just(obj1a,obj1b,obj1c)
    .then();

但是上面的语句返回了Mono的一个空格,不确定在这种情况下,那么许多人如何工作。

我觉得这里缺少了一些东西,我应该如何在完成后控制Flux对象。

共有1个答案

姬天宇
2023-03-14

为了实现这一点,我的初始方法是确保通量是在操作数据之后完成的。

这是反应性编程的错误思维方式——你需要在数据流过通量时修改数据然后()方法将完全忽略通量的结果,并在完成时输出一些其他不相关的Mono

如果您想获取某个元素的Flux,并想将其减少为某个其他元素的Mono,那么您很可能需要reduce()方法。在您的情况下,这将需要一个初始的Obj2,然后是一个BiFunction,其目的是在通量中获取一个中间的Obj2,一个Obj1,然后生成一个更新的Obj2reduce()操作符随后将对整个流应用此缩减,从而为您提供一个Mono

从您的代码中无法立即看出您想要具体实现什么,但下面是一个相关的示例(为了简洁起见使用lombok):

@Data
@AllArgsConstructor
class Obj1 {

    private String a;
    private String combine;
    private String combine2;
}

@Data
@NoArgsConstructor
@AllArgsConstructor
class Obj2 {

    private String a;
    private Map<String, Integer> combine = new HashMap<>();
    private Map<String, Integer> combine2 = new HashMap<>();

}

public class NewClass {

    public static void main(String[] args) {
        Flux<Obj1> flux = Flux.just(
                new Obj1("123", "456", "789"),
                new Obj1("123", "456", "789"),
                new Obj1("123", "455", "789"));

        Mono<Obj2> mono = flux.reduce(new Obj2(), (o2, o1) -> {
            Map<String, Integer> combine = new HashMap<>(o2.getCombine());
            combine.put(o1.getCombine(), combine.getOrDefault(o1.getCombine(), 0) + 1);
            Map<String, Integer> combine2 = new HashMap<>(o2.getCombine2());
            combine2.put(o1.getCombine2(), combine2.getOrDefault(o1.getCombine2(), 0) + 1);
            return new Obj2(o1.getA(), combine, combine2);
        });

        mono.subscribe(System.out::println);
    }

}

 类似资料:
  • 给出这个简化的示例代码: 如何实现reduce操作的结果也是空的?

  • 我运行jmeter脚本将近一周,今天观察到一件有趣的事情。以下是场景: 概述:我正在逐渐增加应用程序的负载。在上一次测试中,我给应用程序加载了100个用户,今天我将加载增加到150个用户。 150名用户测试结果: > 与上次测试相比,请求的响应时间减少了。(这是个好兆头) 吞吐量急剧下降到上一次测试的一半,负载更少。 我的问题是: > 当我的许多请求失败时,我得到了好的响应时间吗? 注:直到100

  • 我对库伯内特斯的世界是陌生的。我正试图在我的个人项目上实现库伯内茨的优势。 我在docker容器中有一个api服务,它从后端获取数据。 我计划在kubernetes集群中的单个外部端口上创建此api服务容器的多个副本。如果副本在单个节点上,它们是否共享流量? 我的最终目标是创建此api服务的多个实例,以使我的应用程序更快(用户可以访问多个api服务中的一个,这将减少单个实例上的流量)。 我在kub

  • 问题内容: 假设我有一个布尔值流,而我正在编写的reduce操作是||(OR)。我是否可以这样编写它:如果true遇到值,则放弃对至少某些元素的求值? 我正在寻找某种程度的优化(也许是并行流),不一定要完全优化,尽管后者会很棒。 问题答案: 我怀疑您想要这种构造。 你可以看一下 Stream.of(1, 2, 3, 4).peek(System.out::println).anyMatch(i -

  • 减少图层数量     初始化图层,处理图层,打包通过IPC发给渲染引擎,转化成OpenGL几何图形,这些是一个图层的大致资源开销。事实上,一次性能够在屏幕上显示的最大图层数量也是有限的。     确切的限制数量取决于iOS设备,图层类型,图层内容和属性等。但是总得说来可以容纳上百或上千个,下面我们将演示即使图层本身并没有做什么也会遇到的性能问题。 裁切     在对图层做任何优化之前,你需要确定你