Skip to content

Commit

Permalink
feat: db routing 개발 중...
Browse files Browse the repository at this point in the history
CEO-Nick committed Jul 24, 2024
1 parent ad6fc42 commit 61376ca
Showing 7 changed files with 93 additions and 22 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.outstagram.outstagram.common.strategy;

import static com.outstagram.outstagram.common.constant.DBConst.DB_COUNT;

public class ShardingStrategy {
public static int getShardId(long userId) {
return (int) (userId % DB_COUNT);
}
}
19 changes: 0 additions & 19 deletions src/main/java/com/outstagram/outstagram/config/DatabaseConfig.java

This file was deleted.

Original file line number Diff line number Diff line change
@@ -4,6 +4,7 @@
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
@@ -14,7 +15,7 @@
public class MySqlConfig {

@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSourceRouting") DataSource dataSource) throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);

Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.outstagram.outstagram.config.database;

public class DataSourceContextHolder {
private static final ThreadLocal<Integer> contextHolder = new ThreadLocal<>();

public static void setShardId(int shardId) {
contextHolder.set(shardId);
}

public static Integer getShardId() {
return contextHolder.get();
}

public static void clearShardId() {
contextHolder.remove();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.outstagram.outstagram.config.database;

import lombok.extern.slf4j.Slf4j;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

@Slf4j
public class DataSourceRouting extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
Integer shardId = DataSourceContextHolder.getShardId();
log.info("=============================== Current Shard ID: {}", shardId);
return shardId;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.outstagram.outstagram.config.database;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;


@Configuration
public class DatabaseConfig {

@Bean(name = "shard0DataSource")
@ConfigurationProperties(prefix = "spring.datasource.shard0")
public DataSource shard0DataSource() {
return DataSourceBuilder.create().build();
}

@Bean(name = "shard1DataSource")
@ConfigurationProperties(prefix = "spring.datasource.shard1")
public DataSource shard1DataSource() {
return DataSourceBuilder.create().build();
}

@Bean
@Primary
public DataSourceRouting dataSourceRouting() {
DataSourceRouting dataSourceRouting = new DataSourceRouting();
Map<Object, Object> dataSources = new HashMap<>();
dataSources.put(0, shard0DataSource());
dataSources.put(1, shard1DataSource());
dataSourceRouting.setTargetDataSources(dataSources);
dataSourceRouting.setDefaultTargetDataSource(shard1DataSource());
return dataSourceRouting;
}
}
13 changes: 11 additions & 2 deletions src/main/java/com/outstagram/outstagram/service/UserService.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.outstagram.outstagram.service;

import com.outstagram.outstagram.common.strategy.ShardingStrategy;
import com.outstagram.outstagram.config.database.DataSourceContextHolder;
import com.outstagram.outstagram.controller.request.EditUserReq;
import com.outstagram.outstagram.dto.UserDTO;
import com.outstagram.outstagram.exception.ApiException;
@@ -63,9 +65,16 @@ public void insertUser(UserDTO userInfo) {
userInfo.setUpdateDate(now);
userInfo.setPassword(encryptedPassword(userInfo.getPassword()));

userMapper.insertUser(userInfo); // mysql에 저장
int shardId = ShardingStrategy.getShardId(userInfo.getId());
log.info("============================== shard id : {}", shardId);
DataSourceContextHolder.setShardId(shardId);
try {
userMapper.insertUser(userInfo); // mysql에 저장
userProducer.save(USER_UPSERT_TOPIC, userInfo); // elasticsearch db에 저장
} finally {
DataSourceContextHolder.clearShardId();
}

userProducer.save(USER_UPSERT_TOPIC, userInfo); // elasticsearch db에 저장
}

/**

0 comments on commit 61376ca

Please sign in to comment.