Skip to content

Load Balancer not refreshing newly added nodes. #716

@pckeyan

Description

@pckeyan

I am working on a use case to bring up server nodes that gets added to LoadBalancedRSocketMono. Server nodes when they come up or goes down will register itself to a collection which is streamed to LoadBalancedRSocketMono. But LoadBalancedRSocketMono works only on the first registered server node when the create method was called. Below is the sample snippet. I was raising this question in community.netifi.com till last week and site is down for now. Can you please help me understand what I am doing wrong or is this a bug?

package com.rsocket.server;

import io.rsocket.Payload;
import io.rsocket.RSocketFactory;
import io.rsocket.client.LoadBalancedRSocketMono;
import io.rsocket.client.filter.RSocketSupplier;
import io.rsocket.transport.netty.client.TcpClientTransport;
import io.rsocket.util.DefaultPayload;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.BaseStream;
import java.util.stream.Collectors;

public class DynamicLBClient {

    public static void main(String[] args) {
        DynamicLBClient dynamicLBClient = new DynamicLBClient();
        dynamicLBClient.callLB();

    }

    private void callLB() {

        int[] server1 = new int[] {9000};
        int[] server2 = new int[] {9001};

        Set<Set<RSocketSupplier>> suppliers = new HashSet<>();

        suppliers.add(Arrays.stream(server1)
                .mapToObj(port -> new RSocketSupplier(() -> Mono.just(RSocketFactory
                        .connect()
                        .transport(TcpClientTransport.create("localhost", port))
                        .start().doOnSubscribe(s -> System.out.println("RSocket connection established." + s))
                        .block())))
                .collect(
                        Collectors.toSet()));

        LoadBalancedRSocketMono balancer = LoadBalancedRSocketMono
                .create(Flux.fromStream(suppliers.stream()));
        Mono<Payload> monoPayload = balancer.block().requestResponse(DefaultPayload.create("test-request"));
        Payload server1Payload = monoPayload.block();
        System.out.println("Response Received Server 1---->" + server1Payload.getDataUtf8());

        suppliers.add(Arrays.stream(server2)
                .mapToObj(port -> new RSocketSupplier(() -> Mono.just(RSocketFactory
                        .connect()
                        .transport(TcpClientTransport.create("localhost", port))
                        .start().doOnSubscribe(s -> System.out.println("RSocket connection established." + s))
                        .block())))
                .collect(
                        Collectors.toSet()));

        Mono<Payload> server2Mono = balancer.log().block().requestResponse(DefaultPayload.create("test-request-second-server"));
        Payload server2Payload = server2Mono.block();
        System.out.println("Response Received- Server 2 --->" + server2Payload.getDataUtf8());

    }
}

Below lines have to be called again in order for the new server node to service the calls:

       balancer = LoadBalancedRSocketMono
                .create(Flux.fromStream(suppliers.stream()));

Metadata

Metadata

Assignees

No one assigned

    Labels

    supersededIssue is superseded by another

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions