fifth
Richard JEON edited this page Nov 10, 2022
·
24 revisions
- ๋น๋ก๊ทธ์ธ ์ํ์์ ๋ณผ ์ ์๋ ์ถ์ฒ ๊ธฐ์ ๋ธ๋ก๊ทธ ํผ๋ ์ฑ๋ ์ ๊ณต -> ์๋ฃ
- Github ๋ก๊ทธ์ธ, ๋ก๊ทธ์์ -> ์๋ฃ
- ๋ก๊ทธ์ธ ์ํ์์ ๊ตฌ๋ , ๊ฐ์ธํํ์ฌ ๊ตฌ์ฑ๋๋ ํผ๋ ์ฑ๋ ์ ๊ณต -> ์๋ฃ
- ํน์ ํผ๋๋ฅผ ๊ณต์ ํ๋ฉฐ ์์ ์ ์๊ฐ์ ๋ง๋ถ์ฌ ๊ณต์ ํ ์ ์๋ SNS ์ฑ๋ ์ ๊ณต -> ๊ฐ๋ฐ ์์
- SNS ์ฑ๋ ํผ๋์ ๋ํ ์ข์์, ๋๊ธ ๊ธฐ๋ฅ ์ ๊ณต -> ๋ณด๋ฅ
- (Optional) ํ์์ด ๋ฉ์ผ ์ค์ ์ ํ์ฑํํ ๊ฒฝ์ฐ, ๊ตฌ๋ ํ RSS ์ค ์ง๋ ํ ์ฃผ๊ฐ ์๋กญ๊ฒ ๋ฑ๋ก๋ ํผ๋๋ค์ ์์ฝํ์ฌ ๋ฉ์ผ ๋ฐ์ก ์๋น์ค -> ๋ณด๋ฅ
- (Optional) ํ์์ด Slack Webhook URL์ ๊ณต ์, ๊ตฌ๋ ํ RSS ์ค ์๋ก์ด ํผ๋ ๋ฑ๋ก ์ Slack ์๋ฆผ ๋ฐ์ก ์๋น์ค -> ๋ณด๋ฅ
ํฐ์บฃ ์ค์ ์ค ์๋ ๊ฐ์ ์ ์ ํ๊ฒ ์ค์ ํ๊ณ , ํด๋น ๊ฐ์ผ๋ก ์ค์ ํ ์ด์ ๋ฅผ ๊ณต์
threads max
, max connections
, accept count
- ์ค์ ์ ๋ํ ์คํ๋ง ๊ณต์๋ฌธ์ ์ค๋ช
- ์ค์ ์ ๋ํ Tomcat ๊ณต์๋ฌธ์ ์ค๋ช
- ๊ฒฐ๋ก
- server.tomcat.accept-count=50
- server.tomcat.max-connections=400
- server.tomcat.threads.min-spare=10
- server.tomcat.threads.max=10
- ๋์ถ ๊ณผ์
- ๊ฐ๋ฐ ์๋ฒ ํผ๋ ์กฐํ API์ ๋ํด 300๋ช ์ด 10๋ฒ ํธ์ถํ๋ ์ํฉ์ผ๋ก ๋ถํํ ์คํธ
- acceptCount, maxConnections, threads.max ๊ธฐ์ค์ผ๋ก ํ ์คํธ ์ํ
- ๊ธฐ๋ณธ๊ฐ : 100, 8192, 200 -> 197 TPS, 1293ms
- threads.max ํ
์คํธ
- 100, 50, 10, 5, 1๋ก ์ค์ฌ๊ฐ๋ฉฐ ํ ์คํธ
- 10์ผ ๋ 213 TPS, 1160ms ๋ก ๊ฐ์ฅ ์ข์ ๊ฒฐ๊ณผ
- threads.max ๋ 10์ผ๋ก ๊ฒฐ์
- max-connections ํ
์คํธ
- threads.max๋ฅผ 20๋ถ์ 1 ์์ค์ผ๋ก ์ค์์ผ๋ ๊ฐ์ ๋น์จ๋ก ์ค์ฌ 400๋ถํฐ ์์
- 400, 100, 10, 10(accept-count๋ 10) ๋ก ์ค์ฌ๊ฐ๋ฉฐ ํ ์คํธ
- max-connections์ accept-count ๋ชจ๋ 10์ผ๋ก ์ค์์ ๋ 153 TPS, 1008ms ๋ก ์ฑ๋ฅ ์ ํ ๋ฐ์
- ๊ทธ์ธ์ 214 ~ 216 TPS, 991ms ~ 1143ms ๋ก ์ ์๋ฏธํ ์ฐจ์ด๊ฐ ์์
- CPU ์ฐ์ฐ ๋ณด๋ค๋ I/O ๋ธ๋ญ์ด ๋ง์ ์น ์ ํ๋ฆฌ์ผ์ด์ ํน์ฑ ์, ์ค๋ ๋ ๋ณด๋ค ๋ง์ ์ปค๋ฅ์ ์๋ฅผ ์ค์ ํ๋ ๊ฒ์ด ์ ์ ํ๋ค๊ณ ํ๋จ
- ์ถ๊ฐ๋ก ์ฐ๋ ๋ ๊ธฐ๋ณธ ์ค์ ๊ฐ์ ๋น์จ๊ณผ ๋ง์ถฐ 400์ ์ค์ ํ๊ธฐ๋ก ๊ฒฐ์
- accept-count
- max-connections๊ฐ ๊ฐ๋ ์ฐผ์ ๋ OS์์ ์์ฒญ์ ๋ด์๋๋ ํ ํฌ๊ธฐ
- OS ์ค์ ์ ๋ฐ๋ผ ์ด ์ค์ ์ ๋ฌด์ํ ์๋ ์์
- accept-count๊ฐ ๊ฐ๋ ์ฐฌ ๋ค ์์ฒญ์ด ์ถ๊ฐ๋ก ์ค๋ฉด OS๊ฐ ์ฐ๊ฒฐ ๊ฑฐ๋ถํ๊ฑฐ๋ ํ์์์๋จ
- ์ฒ๋ฆฌํ ์ ์๋ ์์ ๋ฐ๋ผ accept-count๋ ์กฐ์ ํด์ผํ ๊ฒ์ผ๋ก ํ๋จ
- ๊ธฐ๋ณธ๊ฐ 100์์ 50์ผ๋ก ์ค์ฌ์ ์ค์ ํ๊ธฐ๋ก ๊ฒฐ์
- ํ ์คํธ ์ค์
- ์ต์ข ์ค์ ๋ถํ ํ ์คํธ ๊ฒฐ๊ณผ : 221 TPS, 1110ms
- threads.max=10, min-spare=10, max-connection=400, accept-count=50
- ๊ธฐ๋ณธ ์ค์ ์ธ 200, 10, 8192, 100์ผ ๋์ ์ฑ๋ฅ์ 197 TPS, 1293ms
- ์ปค์คํฐ๋ง์ด์ง ํ TPS 10.86%, ํ๊ท ์๋ต์๊ฐ 14.15% ๊ฐ์
- ์๋น์ค์์ ์ฌ์ฉํ๋ ๋ชจ๋ ์กฐํ ์ฟผ๋ฆฌ์ ํ ์ด๋ธ์ ์ค์ ํ ์ธ๋ฑ์ค ๊ณต์
- ์ธ๋ฑ์ค๋ฅผ ์ค์ ํ ์ ์๋ ์ฟผ๋ฆฌ๊ฐ ์๋ ๊ฒฝ์ฐ, ์ธ๋ฑ์ค๋ฅผ ์ค์ ํ ์ ์๋ ์ด์ ๊ณต์
- ๊ณตํต ํ
์คํธ ํ๊ฒฝ ๊ด๋ จ
- EC2 ์ธ์คํด์ค ์ ๊ท ์์ฑ, MySQL ์ค์น, ์ด์ ํ๊ฒฝ DDL์ ์ด์ฉํด ํ ์ด๋ธ ์์ฑ
- JdbcTemplate batchUpdate๋ก 100๋ง๊ฑด์ 10๋ง๊ฐ์ฉ ๋๋ ์ 10ํ์ ๊ฑธ์ณ ์ด 1000๋ง๊ฑด ๋๋ฏธ ๋ฐ์ดํฐ ์ฝ์
- 1000๋ง ๊ฑด ๋ฐ์ดํฐ ์ฝ์ ์ ์งง๊ฒ๋ 3๋ถ์์ ๊ธธ๊ฒ๋ 9๋ถ ์์
ํ์ ๊ด๋ จ ์ฟผ๋ฆฌ
- ํ ์คํธ ์ ์์
- ๋ก๊ทธ์ธ ์, Github OAuth๋ฅผ ํตํด ์ป์ Provider Id๋ฅผ ๊ธฐ์ค์ผ๋ก DB์ ์ผ์นํ๋ ํ์์ด ์กด์ฌํ๋์ง ๊ฒ์ฆ
- ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ Save, ์กด์ฌํ ๊ฒฝ์ฐ ์กฐํ๋ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ก๊ทธ์ธ ์ฒ๋ฆฌ
- Provider Id๋ฅผ ์กฐํ ์กฐ๊ฑด์ผ๋ก ์ฌ์ฉํ๋ฏ๋ก ์ธ๋ฑ์ค ์ค์ ํด์ผํ ๊ฒ์ผ๋ก ์ถ์ธก
- ํ ์คํธ ๊ฒฐ๊ณผ
- provider_id ์ปฌ๋ผ์ผ๋ก ํ์์ ์กฐํํ์ ๋, 4.2์ด
- id(PK) ์ปฌ๋ผ์ผ๋ก ํ์์ ์กฐํํ์ ๋, 0.08์ด
- provider_id ์ปฌ๋ผ์ ์ธ๋ฑ์ค ์ค์ ํ 0.08์ด๋ก 50๋ฐฐ ์ฑ๋ฅ ํฅ์
- ์คํ ๊ณํ ๋น๊ต
- ์๋ถํฐ ์ฐจ๋ก๋๋ก id๋ก ์กฐํ, ์ธ๋ฑ์ค ์๋ provider_id ๋ก ์กฐํ, ์ธ๋ฑ์ค ์ ์ฉ ํ provider_id ๋ก ์กฐํ.
- ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋๋ก ์คํ๊ณํ์ด ๋ณ๊ฒฝ๋์์
- ์ฝ์ ์ฑ๋ฅ ๋น๊ต
- ์ธ๋ฑ์ค ์ ์ฉ ์ ๊ณผ ํ์ 1000๋ง ๊ฑด ์ฝ์ ์๋ ๋น๊ต
- ์ฐ๊ธฐ ์ฑ๋ฅ ํ๋ฝ์ ๋ฌด์ํด๋ ๋ ์์ค์ผ๋ก ํ๋จ
ํผ๋ ๊ด๋ จ ์ฟผ๋ฆฌ
- ํ ์คํธ ์ ์์
- id๋ก ์กฐํ, link ์ปฌ๋ผ์ผ๋ก ์กฐํ ๋ ๊ฐ์ง ์ฟผ๋ฆฌ๊ฐ ์ฌ์ฉ๋จ
- id๋ก ์กฐํ๋ PK ์ฌ์ฉ์ด๋ฏ๋ก ๋ณ๋ ์ค์ ๋ถํ์ํ ๊ฒ์ผ๋ก ์์
- link ์ปฌ๋ผ์ ์ธ๋ฑ์ค ์ค์ ์ ํตํ ์ฑ๋ฅ ํฅ์์ด ์์๋จ
- ํ ์คํธ ๊ฒฐ๊ณผ
- link ์ปฌ๋ผ์ด varchar(1000) ์ด์ด์ utf8mb4 ํ์์์ 4000byte๊ฐ ๋จ.
- index ์ต๋ ๊ธธ์ด๊ฐ ์ฝ 3000byte ์ฌ์ ๊ธธ์ด ์ ํ ์ด๊ณผ๋ก ์ธํด ์ธ๋ฑ์ค ์ค์ ์ด ๋ถ๊ฐํจ.
- ๋์ fulltext index ์ค์ ์ ์งํํด๋ด
- ์ ์ฌ์ฑ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํด์ฃผ๋ฏ๋ก limit 1 ์ ์ถ๊ฐํด์ PK ์กฐํ์ ๊ฑฐ์ ์ ์ฌํ ์์ค์ผ๋ก ์ฑ๋ฅ ๊ตฌํ ๋์์
- ๋ค๋ง, fulltext ์ธ๋ฑ์ค๋ก ์ธํ ์ฐ๊ธฐ ์ฑ๋ฅ์ ๊ทน๋จ์ ์ธ ์ ํ๊ฐ ์ ๋ฐ๋จ.
- ์ฝ์ ์์ด ๋์ด๋ ์๋ก ์ฐ๊ธฐ๊ฐ ์ง์ฐ๋์ด ๋น ํ ์ด๋ธ์ 1000๋ง๊ฑด์ ์ฝ์ ํ๋ ๋ก์ง ์์ฒด๊ฐ ์์ธ ๋ฐ์๋์ด๋ฒ๋ฆผ
- URL Shortener์ JPA Converter๋ฅผ ์ด์ฉํด DB ์ธ์ํธ ์ ๊ธธ์ด๋ฅผ ์ค์ฌ๋ณผ๊น ๊ณ ๋ฏผํ์ผ๋ ์ค๋ฒ์์ง๋์ด๋ง์ด๋ผ๊ณ ํ๋จ
- URL์ด 750๊ธ์๋ฅผ ์ด๊ณผํ๋ค๋ฉด ๊ทธ๊ฒ๊น์ง ๋์ํ์ง ์์๋ ๋๋ค๊ณ ํ๋จํ์ฌ link ์ปฌ๋ผ์ varchar(750)์ผ๋ก ์์ ํ๊ณ ์ธ๋ฑ์ค ์ค์ ์ผ๋ก ๋ง๋ฌด๋ฆฌ
- link ์ปฌ๋ผ์ผ๋ก ์กฐํ ์์๋ PK ์กฐํ์ ๋์ผํ ์์ค์ ์ฑ๋ฅ ํ์ธ
- ์คํ ๊ณํ ๋น๊ต
- ์์์๋ถํฐ id๋ก ์กฐํ, ์ธ๋ฑ์ค ์์ด link๋ก ์กฐํ, ์ธ๋ฑ์ค ์ค์ ํ link๋ก ์กฐํ
- ์ธ๋ฑ์ค ์ค์ ์ , 1000๋ง ๊ฑด ๋ฐ์ดํฐ์์ link ๋ก ์กฐํ ์ 14์ด ์์
- ์ธ๋ฑ์ค ์ค์ ํ id ์กฐํ์ ์ ์ฌํ๊ฒ 0.14์ด ์์๋ก ์ฑ๋ฅ ๊ฐ์
- ์ฝ์ ์ฑ๋ฅ ๋น๊ต
- ํ์ ์ฌ๋ก์ ๋์ผํ๊ฒ ์ธ๋ฑ์ค ์ค์ ์ผ๋ก ์ธํ ์ฐ๊ธฐ ์ฑ๋ฅ ํ๋ฝ์ ๋ฏธ๋นํ์
- ๋จ, link ์ปฌ๋ผ์ ๊ธธ์ด๋ฅผ 1000์์ 750์ผ๋ก ์ค์ฌ ์ผ๋ฐ ์ธ๋ฑ์ค๋ฅผ ๊ฑธ์์ ๋์ ์ด์ผ๊ธฐ.
- link ๊ธธ์ด๋ฅผ 1000์ผ๋ก ์ ์งํ๋ ค fulltext ์ธ๋ฑ์ค๋ฅผ ๊ฑธ์์ ๋์ ์ธ๋ฑ์ค ์์ฑ์๋ง 8๋ถ์ด ์์๋จ.
- fulltext ์ธ๋ฑ์ค๋ฅผ ์ค์ ํ ํ, 1000๋ง ๊ฑด ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์๋ ํด๋ดค์ผ๋, ๋ฐ์ดํฐ๊ฐ ๋์ด๋ ์๋ก ์ฝ์ ์๋๊ฐ ํฌ๊ฒ ๋์ด๋๋ค๊ฐ, 700๋ง๊ฐ์งธ ์ฝ์ ์๋ ์ค ์์ธ ๋ฐ์ํ๋ฉฐ ์ฒ๋ฆฌ ์คํจ.
- fulltext ์ค์ ์, where ์ ์ match against ๋ฌธ๋ฒ์ ์ด์ฉํด ์ ์ฌ์ฑ ๋ด๋ฆผ์ฐจ์ ์กฐํ๋ผ๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ง๋ง, ์ฝ์ ์ฑ๋ฅ์ ํฌ๊ฒ ํฌ๊ธฐํด์ผํจ์ ์ ์ ์์์
- ์ฌ์ฉ์์ ์ง์ ์ธํฐ๋ ์ ํ์ง ์๋ ํผ๋ ์ ๋ฐ์ดํธ ๋ก์ง์์๋ fulltext ์ธ๋ฑ์ค๋ฅผ ํตํ ์ฐ๊ธฐ ์ฑ๋ฅ์ด ๋ค์ ํฌ์๋๋๋ผ๋ ์ถํ ๊ฐ๋ฐ๋ ์ ์๋ ํผ๋ ๊ฒ์์์์ ๊ฐ๋ ฅํ ์กฐํ ๊ธฐ๋ฅ์ ์ํด ElasticSearch ๋ฑ์ ๊ฒ์ ์์ง์ ๋์ ํ๊ธฐ ์ ๊น์ง๋ ํผ๋์ ์ ๋ชฉ๊ณผ description์ fulltext ์ธ๋ฑ์ค๋ฅผ ๊ฑฐ๋ ๊ฒ๋ ๋ฐฉ๋ฒ์ด ๋ ์ ์๊ฒ ๋ค.
๋ถ๋งํฌ ๊ด๋ จ ์ฟผ๋ฆฌ
- ํ ์คํธ ์ ์์
- bookmark ํ ์ด๋ธ์ id(pk), member_id(fk), feed_id(fk) ๋ฅผ ๊ฐ๋ ํ ์ด๋ธ
- where์ ์ member_id, feed_id ๋ฅผ ๋ชจ๋ ์ฌ์ฉํ๋ ์ด๋ฏธ ๋ถ๋งํฌํ ํผ๋์ธ์ง ์กฐํํ๋ ์ฟผ๋ฆฌ ์กด์ฌ
- where์ ์ member_id ๋ง ์ฌ์ฉํด์ ํ ํ์์ ๊ตฌ๋ ํ ํผ๋๋ค์ ์กฐํํ๋ ์ฟผ๋ฆฌ ์กด์ฌ
- ๋ชจ์กฐ๋ฆฌ ์ธ๋ฑ์ค์ด๋ ์ฑ๋ฅ์ด ์์ฃผ ๋์์ง ์์ ๋ฏ ํ๋ฐ, fk ๋์ ๋ฌถ์ด์ ์กฐํํ๋ ๊ฒฝ์ฐ, ๋ฌถ์ด์ ์๋กญ๊ฒ ํค๋ฅผ ์์ฑํ๋ฉด ๋ ์ฑ๋ฅ์ด ํฅ์๋ ์ง ๊ถ๊ธํ๋ค
- ํ ์คํธ ๊ฒฐ๊ณผ
-
member_id(fk)๋ก๋ง ์กฐํํ๋ ๊ฒฝ์ฐ (ํ์ ๊ฐ์ธ์ ๋ถ๋งํฌํ ํผ๋ ์กฐํ)
- member_id(fk)๋ฅผ where์ ์์ ์ฌ์ฉํ์ฌ ์กฐํํ ๊ฒฝ์ฐ, 1000๋ง๊ฑด ๊ธฐ์ค 1์ด ์์
- ์ธ๋ฑ์ค๋ก member_id ๋ฅผ ํ์ฉํ์ง๋ง, Using Where, Temporary, filesort๊ฐ ์ฌ์ฉ๋จ
- member_id๊ฐ ์นด๋๋๋ฆฌํฐ๊ฐ ๋ ๋์์ member_id, feed_id๋ก ๋ค์ค์ปฌ๋ผ ์ธ๋ฑ์ค ์์ฑ
- 1000๋ง๊ฑด ๊ธฐ์ค 1์ด์์ 0.2์ด๋ก ๊ฐ์
- ๋ค์ค์ปฌ๋ผ ์ธ๋ฑ์ค๊ฐ ์ฌ์ฉ๋๊ณ , Using Where ์ดํ Using Index๊ฐ ์ถ๊ฐ๋จ
-
member_id(fk) + feed_id(fk)๋ก ์กฐํํ๋ ๊ฒฝ์ฐ (๋ถ๋งํฌ ์ถ๊ฐ ์ ์ด๋ฏธ ๋ถ๋งํฌ ๋์ด์๋์ง ์ฌ๋ถ ํ์ธ)
- member_id = ? and feed_id = ? ๋ก where์ ์์ ์กฐํํ๋ ๊ฒฝ์ฐ 1000๋ง๊ฑด ๊ธฐ์ค 54ms ์์
- Using intersect๋ก ๋ ์ธ๋ฑ์ค๋ก ์กฐํํ ๊ฒฐ๊ณผ๋ฅผ ๋จธ์งํ์ฌ ํํฐ๋ง
- ๋ค์ค ์ปฌ๋ผ ์ธ๋ฑ์ค ์ฒ๋ฆฌ ํ
- 1000๋ง ๊ฑด ๊ธฐ์ค 54ms ์์ 46ms๋ก ๊ฐ์
- Using intersect์์ Using Index๋ก ๊ฐ์
- ์คํ ๊ณํ ๋น๊ต
- member_id(fk)๋ก๋ง ์กฐํ ์ feed_id์ ๋ค์ค ์ปฌ๋ผ ์ธ๋ฑ์ค๋ฅผ ์ก์ง ์์์ ๋(์)์ ์ก์์ ๋(์๋)
- ์ค์ ์ดํ ๋ค์ค ์ปฌ๋ผ ์ธ๋ฑ์ค๊ฐ ์ธ๋ฑ์ค ํค๋ก ์ฌ์ฉ๋๊ณ , Using Where ์ดํ Using Index๊ฐ ์ถ๊ฐ๋์๋ค
- member_id(fk) + feed_id(fk) ๋ก ์กฐํํ ์ ๋ค์ค์ปฌ๋ฆผ ์ธ๋ฑ์ค ์ก์ง ์์์ ๋(์)์ ์ก์์ ๋(์๋)
- ์ค์ ์ดํ ๋ค์ค ์ปฌ๋ผ ์ธ๋ฑ์ค๊ฐ ์ธ๋ฑ์ค ํค๋ก ์ฌ์ฉ๋๊ณ , Using Intersect๊ฐ Using Index๋ก ๊ฐ์ ๋์๋ค
- ์ฝ์ ์ฑ๋ฅ ๋น๊ต
- ๋ค์ค ์ปฌ๋ผ ์ธ๋ฑ์ค๋ฅผ ์ก๊ธฐ ์ ๊ณผ ํ์ 1000๋ง ๊ฑด ์ฝ์ ์ฑ๋ฅ ๋น๊ต
- 241์ด์์ 544์ด๋ก ๋ค์ ํ๋ฝ
- bookmark์ ๋ํ ์ฝ์ ์ ํ์์ด ๋ถ๋งํฌ๋ฅผ ์ถ๊ฐํ ๋ ๋ฐ์
- ์ฌ๋ฌ ๊ฑด์ด ๋์์ ๋ฐ์ํ์ง ์๊ณ ๋ฌด์กฐ๊ฑด ๋จ๊ฑด์ผ๋ก๋ง ๋ฐ์
- ๋ถ๋งํฌ ์ถ๊ฐ ์ ์กฐํ ํ ์ฐ๊ธฐ์ธ๋ฐ, ์กฐํ ์ฑ๋ฅ์ด ํจ์ฌ ๊ฐ์ ๋๋ฏ๋ก ๋ค์ค์ปฌ๋ผ ์ธ๋ฑ์ค๋ฅผ ๊ฑฐ๋ ๊ฒ์ด ์ฌ์ฉ์ฑ ๊ฐ์ ์ ์ ์ ํ๋ค๊ณ ํ๋จ
ํ์ ์๊ตฌ์ฌํญ ์ ์ฒด ๋ณด๊ธฐ