ホームページ Java &#&チュートリアル Java で分散ロックを使用して分散システムの同期を実現するにはどうすればよいですか?

Java で分散ロックを使用して分散システムの同期を実現するにはどうすればよいですか?

Aug 03, 2023 am 08:43 AM
分散ロック Java分散ロック 分散システムの同期

Java で分散ロックを使用して分散システムの同期を実現するにはどうすればよいですか?

はじめに:
分散システムでは、複数のノードが共有リソースに同時にアクセスすると、データの競合や同時実行性の問題が発生する可能性があります。データの一貫性を確保するには、分散ロックを使用して分散システムの同期を実現する必要があります。 Java には分散ロックを実装するためのさまざまな方法が用意されていますが、この記事では ZooKeeper と Redis に基づく分散ロックの実装方法をコード例とともに紹介します。

1. ZooKeeper に基づく分散ロックの実装
ZooKeeper は、分散システムにおける同期の問題を解決するための分散ロック メカニズムを提供する分散調整サービスです。以下は、ZooKeeper を使用して分散ロックを実装するサンプル コードです。

import org.apache.zookeeper.*;

import java.io.IOException;
import java.util.Collections;
import java.util.List;

public class ZooKeeperDistributedLock implements Watcher {
    private ZooKeeper zooKeeper;
    private String lockPath;
    private String currentPath;
    private String waitPath;

    public ZooKeeperDistributedLock(String connectString, int sessionTimeout, String lockPath) throws IOException {
        zooKeeper = new ZooKeeper(connectString, sessionTimeout, this);
        this.lockPath = lockPath;
    }

    public void lock() throws KeeperException, InterruptedException {
        if (tryLock()) {
            return;
        }

        while (true) {
            List<String> children = zooKeeper.getChildren(lockPath, false);
            Collections.sort(children);

            int index = children.indexOf(currentPath.substring(lockPath.length() + 1));
            if (index == 0) {
                return;
            }

            waitPath = lockPath + "/" + children.get(index - 1);
            zooKeeper.exists(waitPath, true);
            synchronized (this) {
                wait();
            }
        }
    }

    public void unlock() throws KeeperException, InterruptedException {
        zooKeeper.delete(currentPath, -1);
    }

    private boolean tryLock() throws KeeperException, InterruptedException {
        currentPath = zooKeeper.create(lockPath + "/lock", new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
        List<String> children = zooKeeper.getChildren(lockPath, false);
        Collections.sort(children);
        if (currentPath.endsWith(children.get(0))) {
            return true;
        }
        String currentPathName = currentPath.substring(lockPath.length() + 1);
        int index = children.indexOf(currentPathName);
        if (index < 0) {
            throw new IllegalStateException("Node " + currentPathName + " no longer exists.");
        } else {
            waitPath = lockPath + "/" + children.get(index - 1);
            zooKeeper.exists(waitPath, true);
            synchronized (this) {
                wait();
            }
            return false;
        }
    }

    @Override
    public void process(WatchedEvent event) {
        if (waitPath != null && event.getType() == Event.EventType.NodeDeleted && event.getPath().equals(waitPath)) {
            synchronized (this) {
                notifyAll();
            }
        }
    }
}
ログイン後にコピー

2. Redis ベースの分散ロックの実装
Redis は、いくつかのアトミック操作を提供する高性能のキーと値のストレージ システムです。分散ロック。以下は、Redis を使用して分散ロックを実装するサンプル コードです:

import redis.clients.jedis.Jedis;

public class RedisDistributedLock {
    private Jedis jedis;
    private String lockKey;
    private String requestId;

    public RedisDistributedLock(String host, int port, String password, String lockKey, String requestId) {
        jedis = new Jedis(host, port);
        jedis.auth(password);
        this.lockKey = lockKey;
        this.requestId = requestId;
    }

    public boolean lock(long expireTimeMillis) {
        String result = jedis.set(lockKey, requestId, "NX", "PX", expireTimeMillis);
        return "OK".equals(result);
    }

    public boolean unlock() {
        Long result = (Long) jedis.eval(
                "if redis.call('get', KEYS[1]) == ARGV[1] then " +
                "return redis.call('del', KEYS[1]) " +
                "else " +
                "return 0 " +
                "end",
                1,
                lockKey,
                requestId);
        return result != null && result == 1;
    }
}
ログイン後にコピー

結論:
この記事では、Java で分散ロックを使用して分散システムの同期を実現する 2 つの方法 ( ZooKeeper と Redis に基づく) を紹介します。 ZooKeeper と Redis のどちらを使用しても、分散システムの同期を効果的に実現し、データの一貫性を確保できます。実際のプロジェクトでは、適切な分散ロック ソリューションの選択は、特定のニーズとパフォーマンス要件に基づいて検討する必要があります。この記事があなたのお役に立てれば幸いです、読んでいただきありがとうございます!

以上がJava で分散ロックを使用して分散システムの同期を実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

分散錠:5件 玄関から埋葬まで 分散錠:5件 玄関から埋葬まで Aug 24, 2023 pm 02:48 PM

今日皆さんに共有したいのは分散ロックについてで、この記事では 5 つのケース、図、ソース コード分析などを使用して分析します。同期ロックやロックなどの一般的なロックはすべて単一の JVM に基づいて実装されます。分散シナリオではどうすればよいでしょうか?このとき、分散ロックが登場しました。

Java API開発における分散ロック処理のためのZooKeeperの使用 Java API開発における分散ロック処理のためのZooKeeperの使用 Jun 17, 2023 pm 10:36 PM

最新のアプリケーションが進化し続け、高可用性と同時実行性のニーズが高まるにつれて、分散システム アーキテクチャがより一般的になってきています。分散システムでは、複数のプロセスまたはノードが同時に実行され、一緒にタスクを完了するため、プロセス間の同期が特に重要になります。分散環境では多くのノードが同時に共有リソースにアクセスできるため、分散システムでは同時実行性と同期の問題にどのように対処するかが重要な課題となっています。この点で、ZooKeeper は非常に人気のあるソリューションになっています。ズーキー

分散ロックの王道ソリューション - Redisson 分散ロックの王道ソリューション - Redisson Aug 24, 2023 pm 03:31 PM

以前に Redis を使用していた場合は、Redisson を使用すると、半分の労力で 2 倍の結果が得られます。Redisson は、Redis を使用する最も簡単で便利な方法を提供します。 Redisson の目的は、ユーザーがビジネス ロジックの処理により集中できるように、Redis からユーザーの関心事の分離 (Separation of Concern) を促進することです。

分散ロックの Redis 実装における Etcd の比較 分散ロックの Redis 実装における Etcd の比較 Jun 20, 2023 pm 05:51 PM

分散システムが徐々に普及するにつれて、分散ロックはシステムの安定性とデータの一貫性を確保するための重要な手段になりました。高性能の分散メモリ データベースとして、Redis は必然的に分散ロックの重要な実装の 1 つになりました。しかし、近年、Etcd は新たな分散一貫性ソリューションとしてますます注目を集めています。この記事では、実装原理や比較分析などの観点から、Redis の分散ロック実装と Etcd の類似点と相違点について説明します。 Redis で分散ロックを実装する原理 Redis 分散ロックの実装

Redis を使用して PHP に分散ロックを実装する Redis を使用して PHP に分散ロックを実装する May 15, 2023 pm 03:51 PM

インターネットの急速な発展と Web サイトへのアクセス数の急増に伴い、分散システムの重要性が徐々に顕著になってきました。分散システムでは、同時実行の同期とデータの一貫性の問題が必然的に伴います。分散ロックは、同時実行同期の問題を解決する手段として、分散システムで徐々に広く使用されるようになりました。 PHP では、Redis を使用して分散ロックを実装できます。これについては、この記事で紹介します。分散ロックとは何ですか?分散システムにおいて、複数のマシンが同じタスクを同時に処理する場合、多重マシンの発生を避けるために、

MySQL で分散ロックを使用して同時アクセスを制御するにはどうすればよいですか? MySQL で分散ロックを使用して同時アクセスを制御するにはどうすればよいですか? Jul 30, 2023 pm 10:04 PM

MySQL で分散ロックを使用して同時アクセスを制御するにはどうすればよいですか?データベース システムでは、同時アクセスが多いことが一般的な問題であり、分散ロックは一般的な解決策の 1 つです。この記事では、MySQL で分散ロックを使用して同時アクセスを制御する方法を紹介し、対応するコード例を示します。 1. 原則 分散ロックを使用すると、共有リソースを保護し、同時に 1 つのスレッドだけがリソースにアクセスできるようにすることができます。 MySQL では、分散ロックは次の方法で実装できます。 lock_tabl という名前のファイルを作成します。

Redis での分散ロック実装の詳細な説明 Redis での分散ロック実装の詳細な説明 Jun 21, 2023 am 11:02 AM

モバイル インターネットの急速な発展とデータ量の爆発的な増加に伴い、分散システムの人気が高まっています。分散システムでは、同時操作の問題がますます顕著になっており、複数のスレッドが同時に共有リソースを要求した場合、データの一貫性を確保するためにこれらのリソースをロックする必要があります。分散ロックは、分散システムで同時操作を実装するための効果的なソリューションの 1 つであり、この記事では、Redis を使用して分散ロックを実装する方法を詳しく紹介します。 Redis の基本 Redis は、分散型メモリベースのキー/値ストレージ システムです。

Redis の分散ロック実装の Consul の比較 Redis の分散ロック実装の Consul の比較 Jun 20, 2023 pm 02:38 PM

Redis で分散ロックを実装した Consul の比較 分散システムでは、ロックは不可欠な同期メカニズムです。 Redis が提供する分散ロック機能は、一般的に使用される NoSQL データベースとして広く注目され、応用されています。ただし、Redis には分散ロックの実装時にロックの再取得やタイムアウト処理などの特定の問題があるため、これらの問題を解決するために Consul を含むいくつかの新しいツールが開発されました。この記事では、Redis に分散ロックを実装し、Consul を実装します。

See all articles