ホームページ > Java > &#&チュートリアル > 負荷分散とは何か、およびクライアント側でそれを行う方法

負荷分散とは何か、およびクライアント側でそれを行う方法

Barbara Streisand
リリース: 2025-01-10 22:08:41
オリジナル
127 人が閲覧しました

What is load balancing and how to do it on client side

「負荷分散」は、あらゆるワークロードを維持することと説明できます。たとえば、午前中に 1,000 食の朝食を提供する必要がある場合、作業を 2 ~ 3 人以上のケータリング業者に分担して、配達/準備時間を短縮できます。

コンピューターの世界でも同じロジックが当てはまります。高速に配信したい場合は、作業を分割できます。たとえば、Web サイトの場合は 5 ~ 10 台の Web サーバーを使用できます。この方法では、Web サイトの配信が速くなります (特にトラフィックが多いとき) )、これはサーバー側です。

クライアント側の負荷分散とこれがどのように機能するかについて話したいと思います。たとえば、リクエストごとにバックエンドにクエリを実行し、バックエンドの作業を実行する複数のサーバーがあります。このために WHOIS サービスを使用します

whois1.service.com whois2.service.com

これら 2 つのサーバーですべてのリクエストを負荷分散できます。最も使用されるアルゴリズムとデフォルトのラウンドロビンは、すべてのリクエストが、who1、who2 who1 などのように、別のリクエストに送信されることを意味します。これは、クライアント側で「」で実行できます。 Spring Cloud LoadBalancer」。 3 つのクラスを設定する必要があります

  1. バックエンドのアドレスとポートを定義するための ServiceInstanceListSupplier
  2. エンドポイントのリストを提供するための Bean ServiceInstanceListSupplier
  3. Web クライアントである @LoadBalancerClient はバックエンド呼び出しに使用されます

これで、バックエンドのセットアップ全体が完了しました

public class RestCaller implements ServiceInstanceListSupplier {

    private final String serviceId;

    public RestCaller(String serviceId) {
        this.serviceId = serviceId;
    }

    @Override
    public String getServiceId() {
        return serviceId;
    }

    @Override
    public Flux<List<ServiceInstance>> get() {
        return Flux.just(Arrays.asList(
                new DefaultServiceInstance(serviceId, serviceId, "abc.cyclic.app", 443, true),
                new DefaultServiceInstance(serviceId, serviceId, "someting.koyeb.app", 443, true),
                new DefaultServiceInstance(serviceId, serviceId, "127.0.0.1", 8080, false)
        ));
    }
}


@Configuration
public class RestCallerConfiguration {

    @Autowired
    @Qualifier("webClientBuilder")
    WebClient.Builder webClientBuilder;

    @Bean
    @Primary
    ServiceInstanceListSupplier serviceInstanceListSupplier(ConfigurableApplicationContext ctx) {
        return ServiceInstanceListSupplier
                .builder()
                .withRetryAwareness()
                .withHealthChecks(webClientBuilder.build())
                .withBase(new RestCaller("whoisService"))
                .build(ctx);
    }
}


@Configuration
@LoadBalancerClient(name = "whoisService", configuration = RestCallerConfiguration.class)
public class WebClientConfig {

    @LoadBalanced
    @Bean
    @Qualifier("loadBalancedWebClientBuilder")
    WebClient.Builder loadBalancedWebClientBuilder() {
        return WebClient.builder();
    }

    @Bean
    @Qualifier("webClientBuilder")
    WebClient.Builder webClientBuilder() {
        return WebClient.builder();
    }

}

ログイン後にコピー

これは、任意の @Component または @Service で使用できるようになりました。

@Component
public class WhoisCaller {

    @Autowired
    @Qualifier("loadBalancedWebClientBuilder")
    WebClient.Builder webClientBuilder;

    public String getWhois(String ip, String source) {
        String url = "http://whoisService/whois?ip=" + ip + "&source=" + source;

        return webClientBuilder.build()
                .get()
                .uri(url)
                .retrieve()
                .bodyToMono(String.class)
                .timeout(Duration.ofMinutes(1))
                .doOnError(e -> {
                    WebClientResponseException e1 = (WebClientResponseException) e;
                    log.error(e1.getRequest().getURI().getHost());
                })
                .block();
    }
}

ログイン後にコピー

参考文献:

  • Spring を使用してクライアント側の負荷分散を実装する方法を解決するための SO での私の質問
  • Spring Cloud LoadBalancer

以上が負荷分散とは何か、およびクライアント側でそれを行う方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート