https://github.com/mariadb-corporation/mariadb-connector-j https://mariadb.com/kb/en/failover-and-high-availability-with-mariadb-connector-j/#specifics-for-amazon-aurora mariadb-connector-j 를 사용하여 Aurora DB 로 connection 을 맺게 되면 Transaction 의 readOnly 값에 따라서 read 와 write 가 서로 다른 DNS 로 전달되게 된다. 그 과정을 코드 레벨로 확인한다. 0. read/write seperate 동작 확인 Cluster(Writer) : dev56-a.cluster Cluster(Reader) : dev5..
Gateway 서버는 Proxied 도메인으로 부터 온 응답의 일부분을 임의로 수정하곤 한다. ex) HSTS Header 처럼 보안과 관련된 헤더를 모든 요청에 일괄적으로 넣어줄때 위와 같은 역할을 수행하기 위하여 GlobalFilter 에 Response Header 를 수정하려고 시도하면 아래와 같은 예외가 발생한다. @Override public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { return chain.filter(exchange).then(Mono.fromRunnable(() -> { exchange.getResponse().getHeaders().set("TEST_HEADER", "TEST_HEADER_VA..
MacOS 를 사용하여 Netty 의 NioEventLoop.java 가 사용되었습니다. WebClient -> Netty 로 전달되는 과정에 중점 WebClient 를 호출한 MainThread 에서 실행되는 영역 static { this.webClient = WebClient.builder().baseUrl("http://127.0.0.1:8090") .clientConnector(new ReactorClientHttpConnector(HttpClient.create().compress(true))) .build(); } @PostConstruct public void webClientTest() throws InterruptedException { while(true) { Thread.sleep(3..
Netty 의 NioEventLoop.java 코드 중 핵심이 되는 run() 메서드 분석 MacOS 를 사용중이기 때문에 KqueueSelectorImpl.java 가 사용되었다. EventLoop.java 는 두가지를 처리한다. I/O : Channel 로 부터 발생한 Event 를 받아 I/O Non I/O : Task Queue 에 들어있는 Task 처리. NioEventLoop 생성 static { DEFAULT_EVENT_LOOP_THREADS = Math.max(1, SystemPropertyUtil.getInt( "io.netty.eventLoopThreads", NettyRuntime.availableProcessors() * 2)); if (logger.isDebugEnabled()) ..
1. Client 용 ChannelHandler 작성 public class NettyClientHandler extends SimpleChannelInboundHandler { @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { ctx.writeAndFlush(Unpooled.copiedBuffer("Woongs netty client!", CharsetUtil.UTF_8)); } @Override protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception { System.out.println("Client recei..
1. ChannelHanlder 작성 ChannelHandler 는 이벤트를 수신하고 이벤트에 해당하는 비지니스 로직을 구현할 수 있는 컴포넌트 Netty Server 는 Inbound 이벤트에 반응해야 하므로 ChannelInboundHandler 인터페이스를 구현 @ChannelHandler.Sharable public class NettyServerHandler extends ChannelInboundHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { // msg 가 들어올때마다 호출 ByteBuf in = (ByteBuf) msg; System.out.pr..
Netty 는 비동기식 이벤트 기반 네트워킹 프레임워크 1. Java IO 라이브러리의 단점 Socket 하나당 Thread 하나가 할당되어 Stack Memory 에 Thread 가 쌓임. Client 가 요청을 보내올때까지 대기상태인 Thread는 리소스 낭비. 분당 수십만의 요청을 받는 서버라면 Context Switching 비용이 증가. 2. Java NIO 의 등장 Selector 를 통해 하나의 Thread 가 여러개의 요청 수행 가능 DitrectByteBuffer 를 사용해 OS -> JVM 으로 데이터를 가져오는 Overhead 와 가져온 데이터를 GC 해야하는 Overhead 제거 3. Netty 의 핵심 컴포넌트 Channel Callback Future EventHandler 3...
HashMap 에서 HashTable 을 관리하는 방법과 seperate chaining 이해를 위한 목적의 글입니다. /** The table, initialized on first use, and resized as necessary. When allocated, length is always a power of two. (We also tolerate length zero in some operations to allow bootstrapping mechanics that are currently not needed.) **/ transient Node[] table; HashTable 은 내부에 table 맴버 변수를 가지고 있고 이 변수가 HashTable 의 역할을 수행합니다. put(key,..
Note that this implementation is not synchronized. If multiple threads access a hash map concurrently, and at least one of the threads modifies the map structurally, it must be synchronized externally. Java 의 HashMap 은 Thread Safe 하지 않기 때문에 동시에 여러 쓰레드가 접근할 경우에 외부에서 synchronized 처리가 필요하다. 멀티 쓰레드 환경에서 Thread Safe 하지 않은 HashMap 에 발생할 수 있는 현상. final Map map = new HashMap(); final Integer targetKey =..
Reactor 는 이벤트를 처리하는 Thread 가 publishOn 혹은 subscribeOn 과 같은 함수로 인해서 계속 바뀔 수 있다. 이로 인해서 Transaction, Logback 과 같이 ThreadLocal 을 이용하여 데이터를 전달하는 기능들에 한계가 발생하였다. 이것을 해결하기위하여 Reactive Sequence 상에서 공유되는 데이터를 만들 수 있는데 이 기능이 Context 이다. Context 를 사용하기 전에 확인해보고 싶은 두가지 궁금한점이 있었다. Reactive Stream 을 처리하는 쓰레드가 변경되어도 Context 는 변하지 않는지. Reactive Stream 을 처리하는 과정에서 Context 의 데이터가 변경되면 하위 Stream 에 영향이 있는지. Mono.j..
- Total
- Today
- Yesterday
- mariadb-connector-j
- wait()
- Flux
- RoutePredication
- HashMap
- mariada-connector
- reative
- DyanomoDB
- custom config data convertion
- GlobalFilter
- rate limit
- dynamodb
- referencedColumnName
- N+1
- msyql-connector-java
- getBoolean
- notify()
- reactor
- spring cloud gateway
- RouteDefinition
- AbstractMethodError
- router
- ConcurrentHashMap
- notifyAll()
- Seperate Chaining
- circurit breaker
- Lazy
- ResultSet
- aurora
- MariaDB
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |