티스토리 뷰
어플리케이션에서 다중서버 중 하나의 서버에서만 작동하도록 lock을 걸어야 하는 경우가 있다.
데이터베이스(MySQL, PostgreSQL 등)를 사용하여 lock을 저장하고 각 서버가 시작하기 전에 lock 상태를 확인한다.
- 테이블 생성: lock 정보를 저장할 테이블을 데이터베이스에 생성한다.
- Lock 저장: 특정 서버가 lock을 걸려면 데이터베이스의 lock 테이블에 lock 정보를 저장한다.
- Lock 확인: 각 서버가 시작하기 전에 데이터베이스의 lock 테이블에서 lock 정보를 확인합니다. 그리고 lock이 이미 걸려있을 경우, 다른 서버에서 동작 중인 것으로 판단하고 종료한다.
- Lock 해제: 특정 서버가 lock을 해제할 때, 데이터베이스의 lock 테이블에서 lock 정보를 제거한다.
자바에서 JDBC를 사용하여 데이터베이스와 통신할 수 있다.
분산 락 프레임워크(ZooKeeper, Consul 등)를 사용하여 한 번에 하나의 서버만 lock을 획득할 수 있는 락 기능을 제공한다.
ZooKeeper 분산 락 프레임워크를 사용하는 예시:
- 서버 프로세스는 ZooKeeper 서버에 lock node를 생성한다.
- 서버 프로세스는 lock node에 대한 접근 권한을 요청한다.
- ZooKeeper가 권한을 할당하면 한 번에 하나의 서버만 lock을 획득할 수 있다.
- 작업이 완료되면 서버 프로세스는 lock node를 제거한다.
Consul 분산 락 프레임워크를 사용하는 예시:
- 서버 프로세스는 Consul 서버에 lock session을 생성한다.
- 서버 프로세스는 lock key를 생성하고 lock session ID를 함께 저장한다.
- 서버 프로세스는 lock key를 확인하여 lock session ID가 현재 lock session ID와 일치하는지 확인한다.
- 작업이 완료되면 서버 프로세스는 lock session을 종료한다.
분산 캐시(Hazelcast, Apache Ignite 등)를 사용하여 lock 관리자를 구현하여 분산 lock 기능을 제공한다.
- Hazelcast: HazelcastInstance의 getLock(String lockKey) 메서드를 사용하여 lock 객체를 얻은 후 lock() 메서드를 호출하여 lock을 얻을 수 있다.
HazelcastInstance instance = Hazelcast.newHazelcastInstance();
Lock lock = instance.getLock("myLock");
lock.lock();
try {
// critical section
} finally {
lock.unlock();
}
2. Apache Ignite: IgniteCache의 lock(Object key) 메서드를 사용하여 lock 객체를 얻은 후 lock() 메서드를 호출하여 lock을 얻을 수 있다.
Ignite ignite = Ignition.start();
IgniteCache<Object, Object> cache = ignite.getOrCreateCache("myCache");
try (Transaction tx = ignite.transactions().txStart()) {
cache.lock("myKey");
// critical section
tx.commit();
}
메시지 큐(RabbitMQ, Apache Kafka 등)를 사용하여 lock 기능을 구현하여 각 서버가 lock이 해제될 때까지 기다려야 한다.
- 메시지 큐(RabbitMQ, Apache Kafka 등)를 사용하면 각 서버가 lock을 요청하고, lock이 해제될 때까지 대기하는 기능을 구현할 수 있다.
예를 들어, 각 서버가 lock을 요청하는 메시지를 보내고, lock이 획득된 서버는 lock 해제 메시지를 보내면 다른 서버는 lock을 획득할 수 있게 된다. 이러한 과정은 메시지 큐에서 처리되기 때문에 각 서버의 lock 상태를 제어할 수 있다.
'Back-end > JAVA' 카테고리의 다른 글
Spring Scheduler (0) | 2023.02.02 |
---|---|
스케줄링(Scheduling) (0) | 2023.02.01 |
etcd (0) | 2023.01.31 |
Lock - StampedLock (0) | 2023.01.30 |
Lock - ReentrantReadWriteLock (0) | 2023.01.30 |
- Total
- Today
- Yesterday
- amazon web services
- aws공부순서
- aws개발공부
- aws기초
- 클라우드 컴퓨팅과 아마존 웹 서비스
- AWS
- aws공부
- 아마존 웹 서비스
- 클라우드 컴퓨팅(Cloud computing)
- cloud computing
- aws시작
- 클라우드 컴퓨팅
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |