4월, 2023의 게시물 표시

MacOS Charles SSl 인증서 설치 방법

이미지
Charles로 아이폰을 프록싱 할때 HTTPS 요청들이 path에 <unknown>이라 표시 된다면, Charles 인증서가 설치 되어 있지 않아 내용을 볼 수 없어 그런 것이다. HTTPS 요청의 내용도 볼 수 있도록 하기 위해 Mac과 아이폰에 Charles 인증서를 설치해 보자. 1. Mac에 Charles 인증서 설치 Charles 어플 -> Help -> SSL Proxying -> Install Charles Root Certificate note) 설치시 에러가 난다면 인증서 날짜가 유효한지를 확인 해 보자. 날짜가 유효하지 않으면 아래 과정으로 인증서 재발급을 하자. Charles 어플 -> Help -> SSL Proxying -> Reset Charles Root Certificate... 2. 아이폰에 Charles 인증서 설치 아이폰을 Charles에 연결 후 아래 진행 Charles 어플 -> Help -> SSL Proxying -> Install Charles Root Certificate on a Mobile Device or Remote Browser 아이폰에서 chls.pro/ssl 접속하라는 팝업이 나오고 아이폰에서 브라우저로 접속하면 인증서가 다운로드 된다. 이후 아이폰에서 아래 진행 하자. 설정 -> 일반 -> VPN 및 기기 관리 -> Charles 프로파일 인증 설정 -> 일반 -> 정보 -> 인증서 신뢰 설정 -> on/off 버튼 on으로 3. HTTPS 프록싱하기 아래 설정 완료 하고 나면 HTTPS의 path나 payload도 잘 표시되는 걸 확인 할 수 있다. Charles 어플 -> Proxy -> SSL Proxying Settings

AWS Elasticache IP 변경으로 인한 Timeout 해결책

elasticache node 스펙 변경으로 node 교체가 되면서 이들의 private ip가 바뀌는 상황이 있었다. 다른 Spring boot 서버들이 lettuce에 elasticache configuration endpoint로 설정하여 사용중이였기에 자동 ip 전환이 되길 기대하고 있었으나 지속된 redis timeout... lettuce에서 한번 redis ip가 설정되면 재부팅 전까지 값이 변경 되지 않는다는 걸 알게 되었다. elasticache는 한번씩 의도하지 않은 ip 변경이 있을때가 있어 luttuce에서 ip refresh를 할 수 있도록 해결책이 필요하게 되었다. 이런 저런걸 알아봤는데 우선 해결책부터 https://github.com/lettuce-io/lettuce-core/issues/822 요약) enablePeriodicRefresh=true 혹은 원하는 refresh interval (true로 줄 경우 60s) elasticasche를 사용할 경우  dynamicRefreshSources disable 아래 코드 참조 final var topologyRefreshOptions = ClusterTopologyRefreshOptions . builder () . dynamicRefreshSources ( false ) . enablePeriodicRefresh ( Duration . ofSeconds ( 30 )) . build (); final var clientOptions = ClusterClientOptions . builder ()

Sliding Window vs Tumbling Window

이미지
 아래 그림으로 설명이 가능할 듯 하다. Sliding Window length = 10s, interval = 5s 10초 크기의 윈도우가 5초씩 미끄러져 간다. Tumbling Window length = 5s 0 ~ 5초, 5초후에는 5초 ~ 10초, 10초 후에는 10초 ~ 15초로 구간 분리.  출처 :  https://docs.cloudera.com/HDPDocuments/HDP3/HDP-3.0.1/developing-storm-applications/content/understanding_sliding_and_tumbling_windows.html

Spring Cloud Stream Kafka Binder 정리

 spring cloud stream 3.0 을 기준으로 programming model에 변경이 있었다. 3.0 이전 : Imperative(선언적) -> 어노테이션 방식 ex) @StreamListener, @Input, @Output 3.0 이후 : Functional style 그러니 functional 형태로 된 예제를 spring cloud stream kafka binder 공식 홈페이지 의 것을 참조하여 살펴 볼 것이다. 우선 functional consumer를 만드는 순서는 다음과 같다. java.util.function.Consumer를 반환하는 bean 생성 spring.cloud.stream.functionl.definition 설정 binding name의 property 설정 1 2 3 4 5 6 7 8 9 10 11 12 @SpringBootApplication public class SimpleConsumerApplication { @Bean public java . util . function . Consumer < KStream < Object , String >> process () { return input -> input . foreach (( key , value ) -> { System . out . println ( "Key: " + key + " Value: " + value ); }); } } 위처럼 bean 생성하고 1 spring.cloud.stream.functionl.definition=process사 사용할 bean을 명시 후 1 spring.cloud.stream.bindings.process-in-0.destination=my_