티스토리 뷰
오늘 TIL 3줄 요약
- 동시성은 소프트웨어 동작 방식이고, 병렬성은 하드웨어가 하는 것
- 수정 가능한 리소스를 공유하는 애플리케이션 코드 어디에서나 동시성 문제가 발생할 수 있다.
- 불규칙한 실패는 동시성 문제인 경우가 대다수!
TIL (Today I Learned)
2022.03.29
오늘 읽은 범위
6장. 동시성 p241-p272
책에서 기억하고 싶은 내용을 써보세요.
시간적 결합 깨트리기
- 우리가 신경쓰는 유일한 시간은
일정
, 바로출시까지 남은 시간
뿐이다. - 시간에는 우리가 신경 써야 할 측면이 두 가지 있는데,
동시성(동시에 일어나는 일)
과순서(시간의 흐름 속에서 일들의 상대적인 위치)
다.
=> 나는 동시성과 순서를 신경쓰며, 프로그래밍을 해왔는가? 창피하지만 내 대답은 두가지 모두 신경 쓰지 않았다는 것이다. 구현해야 할 기능을 확인하면 대게 그 자리에서 "먼저 이걸 하고, 그 다음에 저걸 해야지!"하는 사고방식으로 개발을 해왔다. 하지만, 이런 사고방식은 시간적 결합을 만든다고 한다. 유연하지 못하고 현실과도 동떨어진 사고 방식은 이제 그만 휴지통에 넣고, 시간이나 순서에 의존하지 않는 방법을 뭐가 있을까 고민해서 개발을 진행해야겠다!
동시성과 병렬 작업
- 활동 다이어그램은
동시에 작업할 수 있는 부분
들을 보여준다. - 활동 다이어그램을 사용하면
동시에 수행할 수 있는데도 아직 동시에 하고 있지 않은 활동
들을 찾아서 병렬성을 극대화할 수 있다. 동시성은 소프트웨어 동작 방식
이고,병렬성은 하드웨어가 하는 것
이다.
=> 병렬성은 테스트하기도 까다롭고, 안전한지에 대한 의문있어서 그동안 기피해왔다. 역시 좋은건 어려운거같다.(어려우니까 좋은걸까?) 구현해야할 기능이 있다면, 혼자서 활동 다이어그램을 만들어보고, 병렬성이 필요하다고 느끼는 곳을 고려하여 설계하도록 노력해야겠다.
공유 메모리는 동시성 문제의 원인
수정 가능한 리소스를 공유
하는 애플리케이션 코드 어디에서나동시성 문제가 발생
할 수 있다.불규칙한 실패
는동시성 문제
인 경우가 많다.
=> 아...동시성은 정말 어렵다. 공부할 것이 또 늘었다. 실제 개발하다보면 각기 다른 쓰레드에서 자원을 공유하는 경우가 발생한다. 나는 아직 접해보지는 못했지만, 스프링에서 이런 동시성 이슈가 발생하면 ThreadLocal을 이용해서 해결(Thread가 작업을 마치면 반드시 remove()를 호출해야 함)할 수 있다.
메시지 시스템과 칠판의 유사성
- 카프카나 NATS 같은 이런 메시징 시스템은 단순히 데이터를 A에서 B로 보내는 것보다
훨씬 많은 일
을 한다. - 이벤트 로그의 형태로
영속성을 제공
하고, 패턴 매칭 형태로 메시지를가져오는 것도 지원
한다. - 메시징 시스템은
칠판으로도 사용
할 수 있고,여러 액터를 실행하는 플랫폼으로도 사용
할 수 있다는 것이다. 심지어동시에 둘 모두로 사용
할 수도 있다.
=> 메시지 시스템을 사용함으로써 얻을 수 있는 이점은 확실하지만, 동시에 많은 접근으로 인해 추적하기 힘들어지는 단점이 있다. 이에 대한 해결책으로 각 요청 마다 traceId를 만들어 수행되는 로직에 traceId를 전파해서 log에 기록하면 관리가 쉽다고 하니 나도 기회가 되면 직접 구현해봐야겠다.
오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요
동시성.. 정말 어렵게만 느껴지는 단어다. 서비스를 운영하면서 "동시성을 고려해서 코드를 작성해야지"하는 마음으로 임하고는 있어도 막상 해당 이슈가 발생하면 겁나는 현실이다. 이번 6장은 내용이 개인적으로 상당히 좋았다. 동시성을 워낙 어려워했기 때문에 두려운것이 사실이었지만, 그런 나에게 동시성의 주요 발생 이유와 설계, 해결하기 위한 방법까지 현명하게 알려주었다(다만, 내용이 나에겐 조금 어려워서 한 번 더 읽어봐야겠다..). 신경써야 할 시간에는 동시성과 순서 두 가지가 존재한다고하는데, 어떻게해야 시간과 순서에 의존하지 않는 코드를 짤 수 있을지 고민하게되는 시간이었다.
궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요.
6장 동시성은 전부 어려웠던 것 같다. 전체적으로 다시 한 번 읽어봐야겠다.
'Book > 실용주의 프로그래머' 카테고리의 다른 글
[TIL 8] 실용주의 프로그래머 #8. 프로젝트 전에 (0) | 2022.04.03 |
---|---|
[TIL 7] 실용주의 프로그래머 #7. 코딩하는 동안 (0) | 2022.04.02 |
Mission: 연습문제 풀이! (0) | 2022.03.27 |
[TIL 5] 실용주의 프로그래머 #5. 구부러지거나 부러지거나 (0) | 2022.03.26 |
[TIL 4] 실용주의 프로그래머 #4. 실용주의 편집증 (0) | 2022.03.24 |
- Total
- Today
- Yesterday
- 릿코드
- 파이썬
- MySQL
- mysql 8.0
- 코테
- 그리디
- 백준
- 노마드
- leetcode
- webflux
- 코틀린
- 노마드코더
- 인프런
- 알고리즘
- 스프링부트
- Spring
- kotlin
- spring boot
- 데이터베이스
- 북클럽
- 정렬
- 리팩토링
- 문자열
- 스프링 부트
- 김영한
- 스프링
- 구현
- 자료구조
- Algorithm
- Real MySQL
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |