์ต๊ทผ์ ํ์ค ๋ ์ํผ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฉ๋ฒ์ ์๋ ค ๋๋ ธ์ต๋๋ค.
#1. ๋จ๋ฉดํ
์ ๋ฆฌํ ๊ฐ์น๊ฐ ์๋ ๋ฐฉ๋ฒ๊ณผ ์ด์ ์ ๋ํ ๊ธฐ์ฌ
"์ง๋๊ฐ ์ผ๋ค..."
์ฒ์์๋ ๋ค๋ฅธ MVP์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฐ๋ฆฌ ํ๋ก์ ํธ๋ ์๋นํ ๊ฐ๋ฒผ์ด ๋ถํ๋ก ์์๋์์ต๋๋ค. ๋ชจ๋ํฐ๋ง์ ๊ฐ์ฅ ์ค์ํ XNUMX๊ฐ์ ์๋ฒ์ ๋ํด์๋ง ์ํ๋์์ผ๋ฉฐ ๋ชจ๋ ํ ์ด๋ธ์ ์๋์ ์ผ๋ก ์์์ต๋๋ค... ๊ทธ๋ฌ๋ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๋ชจ๋ํฐ๋ง๋๋ ํธ์คํธ์ ์๊ฐ ์ ์ ๋ ๋ง์์ก์ต๋๋ค. , ๋ค์ ํ ๋ฒ ์ฐ๋ฆฌ๋ ๋ค์ ์ค ํ๋๋ฅผ ์ฌ์ฉํ์ฌ ์์ ์ ์๋ํ์ต๋๋ค. ํ ์ด๋ธ ํฌ๊ธฐ 1.5TB, ์ด๋ ๊ฒ ๊ณ์ ์ด์๊ฐ ์๋ ์์ง๋ง ๋งค์ฐ ๋ถํธํ๋ค๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค.
์๋๋ ๊ฑฐ์ ์์ฒญ๋ ์๋์ ๊ฐ์๊ณ , PostgreSQL 9.x์ ๋ค์ํ ๋ฒ์ ์ด ๊ด๋ จ๋์ด ์์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ํํฐ์
๋์ "์๋"์ผ๋ก ์ํ๋์ด์ผ ํ์ต๋๋ค. ํ
์ด๋ธ ์์ ๋ฐ ํธ๋ฆฌ๊ฑฐ ๋์ ๋ผ์ฐํ
EXECUTE
.
๊ฒฐ๊ณผ ์๋ฃจ์
์ ๋ชจ๋ ํ
์ด๋ธ๋ก ๋ณํ๋ ์ ์์ ๋งํผ ๋ณดํธ์ ์ธ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค.
- ๋ชจ๋ ๋ด์ฉ์ ์ค๋ช ํ๋ ๋น "ํค๋" ์์ ํ ์ด๋ธ์ด ์ ์ธ๋์์ต๋๋ค. ํ์ํ ์ธ๋ฑ์ค ๋ฐ ํธ๋ฆฌ๊ฑฐ.
- ํด๋ผ์ด์ธํธ ์
์ฅ์์ ๊ธฐ๋ก์ โ๋ฃจํธโ ํ
์ด๋ธ์ ์์ฑ๋์์ผ๋ฉฐ, ๋ด๋ถ์ ์ผ๋ก๋ ๋ผ์ฐํ
ํธ๋ฆฌ๊ฑฐ
BEFORE INSERT
๋ ์ฝ๋๊ฐ ํ์ ์น์ ์ "๋ฌผ๋ฆฌ์ ์ผ๋ก" ์ฝ์ ๋์์ต๋๋ค. ์์ง ๊ทธ๋ฌํ ๊ฒ์ด ์๋ค๋ฉด ์์ธ๋ฅผ ํฌ์ฐฉํ๊ณ ... - โฆ ์ฌ์ฉํ์ฌ
์์ ํ ์ด๋ธ์ ํ ํ๋ฆฟ์ ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋์์ต๋๋ค. ์ํ๋ ๋ ์ง์ ์ ํ์ด ์๋ ๊ตฌ๊ฐ๋ฐ๋ผ์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ ๋ ํด๋น ๋ฐ์ดํฐ์์๋ง ์ฝ๊ธฐ๊ฐ ์ํ๋ฉ๋๋ค.CREATE TABLE ... (LIKE ... INCLUDING ...)
PG10: ์ฒซ ๋ฒ์งธ ์๋
๊ทธ๋ฌ๋ ์์์ ํตํ ๋ถํ ์ ์ญ์ฌ์ ์ผ๋ก ํ์ฑ ์ฐ๊ธฐ ์คํธ๋ฆผ์ด๋ ๋ค์์ ํ์ ํํฐ์ ์ ์ฒ๋ฆฌํ๋ ๋ฐ ์ ํฉํ์ง ์์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ํ์ํ ์น์ ์ ์ ํํ๋ ์๊ณ ๋ฆฌ์ฆ์ด XNUMX์ฐจ ๋ณต์ก๋, 100๊ฐ ์ด์์ ์น์ ์์ ์๋ํ๋ค๋ ์ ์ ์ง์ ์ดํดํ์ค ์ ์์ต๋๋ค...
PG10์์๋ ์ง์์ ๊ตฌํํ์ฌ ์ด๋ฌํ ์ํฉ์ด ํฌ๊ฒ ์ต์ ํ๋์์ต๋๋ค.
๋งค๋ด์ผ์ ์ดํด๋ณธ ํ ๋ฐํ์ง ๋ฐ์ ๊ฐ์ด, ์ด ๋ฒ์ ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ํํฐ์ ๋ ํ ์ด๋ธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ธ๋ฑ์ค ์ค๋ช ์ ์ง์ํ์ง ์์ต๋๋ค.
- ํธ๋ฆฌ๊ฑฐ๋ฅผ ์ง์ํ์ง ์์ต๋๋ค
- ๋๊ตฌ์ 'ํ์'๋ ๋ ์ ์๋ค
- ์ง์ํ์ง ์์ต๋๋ค
INSERT ... ON CONFLICT
- ์น์ ์ ์๋์ผ๋ก ์์ฑํ ์ ์์ต๋๋ค.
๊ฐํด๋ก ์ด๋ง์ ๊ณ ํต์ค๋ฌ์ด ํ๊ฒฉ์ ๊ฐํ ์ฐ๋ฆฌ๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ์์ ํ์ง ์์ผ๋ฉด ๋ถ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ๊นจ๋ฌ์๊ณ ์ถ๊ฐ ์ฐ๊ตฌ๋ฅผ XNUMX ๊ฐ์ ๋์ ์ฐ๊ธฐํ์ต๋๋ค.
PG10: ๋ ๋ฒ์งธ ๊ธฐํ
๊ทธ๋์ ์ฐ๋ฆฌ๋ ๋ฐ์ํ ๋ฌธ์ ๋ฅผ ํ๋์ฉ ํด๊ฒฐํ๊ธฐ ์์ํ์ต๋๋ค.
- ์๋ํ๋ฉด ํธ๋ฆฌ๊ฑฐ์
ON CONFLICT
์ฌ๊ธฐ์ ๊ธฐ์ ์์ง ํ์ํ๋ค๊ณ ํ๋จ๋์ด ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์ค๊ฐ ๋จ๊ณ๋ฅผ ๋ง๋ค์์ต๋๋ค. ํ๋ก์ ํ ์ด๋ธ. - "๋ผ์ฐํ
"์ ์ ๊ฑฐํ์ต๋๋ค. ํธ๋ฆฌ๊ฑฐ์์ - ์ฆ,
EXECUTE
. - ๋ฐ๋ก ๊บผ๋ด๋์ผ์ จ์ด์ ๋ชจ๋ ์ธ๋ฑ์ค๊ฐ ํฌํจ๋ ํ ํ๋ฆฟ ํ ์ด๋ธ๊ทธ๋์ ๊ทธ๋ค์ ํ๋ก์ ํ ์ด๋ธ์๋ ์กด์ฌํ์ง ์์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก, ์ฐ๋ฆฌ๋ ๊ธฐ๋ณธ ํ
์ด๋ธ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ถํ ํ์ต๋๋ค. ์๋ก์ด ์น์
์ ์์ฑํ๋ ๊ฒ์ ์ฌ์ ํ โโ์ ํ๋ฆฌ์ผ์ด์
์ ์์ฌ์ ๋ฌ๋ ค ์์ต๋๋ค.
"ํฑ์ง" ์ฌ์
๋ค๋ฅธ ๋ถ์ ์์คํ
๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฐ๋ฆฌ๋ ๋ํ "์ฌ์ค"๊ณผ "์ปท" (์ฌ์ ). ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ ๊ทธ๋ค์ ์ด๋ฌํ ์๊ฒฉ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด ํ๋ํ์ต๋๋ค.
โFactsโ๋ ์ด๋ฏธ ์ค๋ซ๋์ ๋ ์ง๋ณ๋ก ๊ตฌ๋ถ๋์ด ์์๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๋ ์ค๋๋ ๋ถ๋ถ์ ์นจ์ฐฉํ๊ฒ ์ญ์ ํ๊ณ ๊ทธ๊ฒ๋ค์ ์ฐ๋ฆฌ๋ฅผ ๊ดด๋กญํ์ง ์์์ต๋๋ค(๋ก๊ทธ!). ๊ทธ๋ฐ๋ฐ ์ฌ์ ์ ๋ฌธ์ ๊ฐ ์์๋ค์...
๋ง์ด ์์๋ค๋ ๊ฒ์ ์๋์ง๋ง ๋๋ต 100TB์ "์ฌ์ค"๋ก ์ธํด 2.5TB์ ์ฌ์ ์ด ํ์ํ์ต๋๋ค.. ๊ทธ๋ฌํ ํ ์ด๋ธ์์๋ ๋ฌด์์ด๋ ํธ๋ฆฌํ๊ฒ ์ญ์ ํ ์ ์๊ณ , ์ ์ ํ ์๊ฐ ๋ด์ ์์ถํ ์ ์์ผ๋ฉฐ, ์ฐ๊ธฐ ์๋๊ฐ ์ ์ฐจ ๋๋ ค์ก์ต๋๋ค.
์ฌ์ ์ฒ๋ผ... ๊ทธ ์์๋ ๊ฐ ํญ๋ชฉ์ด ์ ํํ ํ ๋ฒ๋ง ํ์๋์ด์ผ ํฉ๋๋ค... ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ด ๋ง์ต๋๋ค. ํ์ง๋ง!... ์๋ฌด๋ ์ฐ๋ฆฌ๊ฐ ํ๋ ๊ฒ์ ๋ง์ง ์์ต๋๋ค. ๋งค์ผ ๋ณ๋์ ์ฌ์ ! ์, ์ด๋ ํน์ ์ค๋ณต์ฑ์ ์ ๊ณตํ์ง๋ง ๋ค์์ ํ์ฉํฉ๋๋ค.
- ๋ ๋น ๋ฅด๊ฒ ์ฐ๊ธฐ/์ฝ๊ธฐ ์น์ ํฌ๊ธฐ๊ฐ ์๊ธฐ ๋๋ฌธ์
- ๋ ์ ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋นํฉ๋๋ค ๋ณด๋ค ์ปดํฉํธํ ์ธ๋ฑ์ค๋ก ์์ ํ์ฌ
- ๋ ์ ์ ์์ ๋ฐ์ดํฐ ์ ์ฅ ์ค๋๋ ๊ฒ์ ๋น ๋ฅด๊ฒ ์ ๊ฑฐํ ์ ์๋ ๋ฅ๋ ฅ ๋๋ฌธ์
์ ์ฒด์ ์ธ ์กฐ์น์ ๊ฒฐ๊ณผ๋ก CPU ๋ก๋๊ฐ ~30% ๊ฐ์ํ๊ณ ๋์คํฌ ๋ก๋๊ฐ ~50% ๊ฐ์ํ์ต๋๋ค.:
๋์์ ์ฐ๋ฆฌ๋ ๋ ์ ์ ๋ถํ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ํํ ๋์ผํ ๋ด์ฉ์ ๊ณ์ ๊ธฐ๋กํ์ต๋๋ค.
#2. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์งํ ๋ฐ ๋ฆฌํฉํ ๋ง
๊ทธ๋์ ์ฐ๋ฆฌ๋ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง ๊ฒ์ ๊ฒฐ์ ํ์ต๋๋ค ๋งค์ผ ์์ ์ ์น์
์ด ์์ต๋๋ค ๋ฐ์ดํฐ๋ก. ์ค์ ๋ก, CHECK (dt = '2018-10-12'::date)
โ ๊ทธ๋ฆฌ๊ณ ๋ ์ฝ๋๊ฐ ํน์ ์น์
์ ์ํ๊ธฐ ์ํ ๋ถํ ํค์ ์กฐ๊ฑด์ด ์์ต๋๋ค.
๋น์ฌ ์๋น์ค์ ๋ชจ๋ ๋ณด๊ณ ์๋ ํน์ ๋ ์ง์ ๋งฅ๋ฝ์์ ์์ฑ๋๋ฏ๋ก "๋ถํ ๋์ง ์์ ์๊ฐ" ์ดํ ํด๋น ๋ณด๊ณ ์์ ๋ํ ์ธ๋ฑ์ค๋ ๋ชจ๋ ์ ํ์ด์์ต๋๋ค. (์ฌ๊ธฐ๋ ์ฌ๋, ๋ ์ง, ๊ณํ ํ ํ๋ฆฟ), (์ฌ๊ธฐ๋ ์ฌ๋, ๋ ์ง, ๊ณํ ๋ ธ๋), (๋ ์ง, ์ค๋ฅ ํด๋์ค, ์๋ฒ), ...
ํ์ง๋ง ์ด์ ๊ทธ๋ค์ ๋ชจ๋ ๊ตฌ์ญ์ ์ด๊ณ ์์ด์ ๋น์ ์ ์ฌ๋ณธ ๊ฐ ์ธ๋ฑ์ค... ๊ทธ๋ฆฌ๊ณ ๊ฐ ์น์ ๋ด์์ ๋ ์ง๋ ์ผ์ ํฉ๋๋ค... ์ด์ ์ฐ๋ฆฌ๋ ๊ทธ๋ฌํ ๊ฐ ์์ธ์ ์์์ด ๋ฐํ์ก์ต๋๋ค ๋จ์ํ ์์๋ฅผ ์ ๋ ฅํ์ธ์ ํ๋ ์ค ํ๋๋ก ๋ณผ๋ฅจ๊ณผ ๊ฒ์ ์๊ฐ์ด ๋ชจ๋ ์ฆ๊ฐํ์ง๋ง ๊ฒฐ๊ณผ๋ ๋์ค์ง ์์ต๋๋ค. ๊ทธ๋ค์ ๊ฐํด๋ฅผ ๊ทธ๋ค ์์ ์๊ฒ ๋งก๊ฒผ์ต๋๋ค. ์ด๋ฐ...
์ต์ ํ ๋ฐฉํฅ์ ๋ถ๋ช
ํฉ๋๋ค. - ๋จ์ํฉ๋๋ค. ๋ชจ๋ ์์ธ์์ ๋ ์ง ํ๋๋ฅผ ์ ๊ฑฐํ์ญ์์ค. ํํฐ์
๋ ํ
์ด๋ธ์์. ์ฐ๋ฆฌ์ ๊ฑฐ๋๋์ ๊ฐ์ํ ๋ ์ด์ต์ ์ฝ 1TB/์ฃผ!
์ด์ ์ด ํ ๋ผ๋ฐ์ดํธ๋ ์ด๋ป๊ฒ๋ ๊ธฐ๋ก๋์ด์ผ ํ๋ค๋ ์ ์ ์ฃผ๋ชฉํด ๋ณด๊ฒ ์ต๋๋ค. ์ฆ, ์ฐ๋ฆฌ๋ ์ด์ ๋์คํฌ์ ๋ก๋๊ฐ ์ค์ด๋ญ๋๋ค! ์ด ์ฌ์ง์ ์ฐ๋ฆฌ๊ฐ ์ผ์ฃผ์ผ ๋์ ์ง์คํ ์ฒญ์๋ฅผ ํตํด ์ป์ ํจ๊ณผ๋ฅผ ๋ช ํํ๊ฒ ๋ณด์ฌ์ค๋๋ค.
#์ผ. ์ต๋ ๋ถํ๋ฅผ "ํ์ฐ"
๋ก๋๋ ์์คํ ์ ๊ฐ์ฅ ํฐ ๋ฌธ์ ์ค ํ๋๋ ์ค๋ณต ๋๊ธฐํ ํ์ํ์ง ์์ ์ผ๋ถ ์์ . ๋๋ก๋ "๊ทธ๋ค์ด ๋์น์ฑ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์", ๋๋ก๋ "๊ทธ๊ฒ ๋ ์ฌ์ ์ด์"๋ผ๊ณ ํ์ง๋ง ์กฐ๋ง๊ฐ ์ ๊ฑฐํด์ผ ํฉ๋๋ค.
์ด์ ์ฌ์ง์ ํ๋ํ์ฌ ๋์คํฌ๊ฐ ์๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ด์ค ์งํญ์ ๋ถํ์์ "ํํ" ์ด๋ ๋ถ๋ช ํ "ํต๊ณ์ ์ผ๋ก" ์ด๋ฌํ ์ฌ๋ฌ ์์ ์์ ๋ฐ์ํด์๋ ์ ๋๋ ์ธ์ ์ํ ์ฌ์ด์ ์์ ์ ๋๋ค.
์ด๊ฒ์ ๋ฌ์ฑํ๊ธฐ ๋งค์ฐ ์ฝ์ต๋๋ค. ์ด๋ฏธ ๋ชจ๋ํฐ๋ง์ ์์ํ์ต๋๋ค ๊ฑฐ์ 1000๊ฐ์ ์๋ฒ, ๊ฐ๊ฐ์ ๋ณ๋์ ๋
ผ๋ฆฌ์ ์ค๋ ๋์ ์ํด ์ฒ๋ฆฌ๋๋ฉฐ ๊ฐ ์ค๋ ๋๋ ๋ค์๊ณผ ๊ฐ์ด ํน์ ๋น๋๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ก๋๋๋ก ์ถ์ ๋ ์ ๋ณด๋ฅผ ์ฌ์ค์ ํฉ๋๋ค.
setInterval(sendToDB, interval)
์ฌ๊ธฐ์ ๋ฌธ์ ๋ ๋ฐ๋ก ๋ค์๊ณผ ๊ฐ์ ์ฌ์ค์ ์์ต๋๋ค. ๋ชจ๋ ์ค๋ ๋๋ ๊ฑฐ์ ๋์์ ์์๋ฉ๋๋ค., ๋ฐ๋ผ์ ์ ์ก ์๊ฐ์ ๊ฑฐ์ ํญ์ "์์ ๊น์ง" ์ผ์นํฉ๋๋ค. ์ #2...
๋คํํ๋ ์ด ๋ฌธ์ ๋ ํด๊ฒฐํ๊ธฐ๊ฐ ๋งค์ฐ ์ฝ์ต๋๋ค. "๋ฌด์์" ๋ฐ์ ์ถ๊ฐ ์๊ฐ๋ณ:
setInterval(sendToDB, interval * (1 + 0.1 * (Math.random() - 0.5)))
#4. ํ์ํ ๊ฒ์ ์บ์ํฉ๋๋ค.
์ธ ๋ฒ์งธ ์ ํต์ ์ธ ๊ณ ๋ถํ ๋ฌธ์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์บ์ ์์ ๊ทธ๊ฐ ์ด๋์ ์๋์ง ํ ์ ์์๋ค ๊ทธ๋ ๋ค.
์๋ฅผ ๋ค์ด, ์ฐ๋ฆฌ๋ ๊ณํ ๋
ธ๋(์ด ๋ชจ๋ ๊ฒ) ์ธก๋ฉด์์ ๋ถ์์ ๊ฐ๋ฅํ๊ฒ ํ์ต๋๋ค. Seq Scan on users
), ๊ทธ๋ฌ๋ ๊ทธ๋ค์ ๋๋ถ๋ถ ๋์ผํ๋ค๊ณ ์ฆ์ ์๊ฐํฉ๋๋ค. ๊ทธ๋ค์ ์์ด๋ฒ๋ ธ์ต๋๋ค.
์๋์, ๋ฌผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์๋ ์๋ฌด ๊ฒ๋ ๋ค์ ๊ธฐ๋ก๋์ง ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ํธ๋ฆฌ๊ฑฐ๊ฐ ์ฐจ๋จ๋ฉ๋๋ค. INSERT ... ON CONFLICT DO NOTHING
. ํ์ง๋ง ์ด ๋ฐ์ดํฐ๋ ์ฌ์ ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋๋ฌํ๋ฏ๋ก ๋ถํ์ํฉ๋๋ค. ์ถฉ๋์ ํ์ธํ๊ธฐ ์ํด ์ฝ๊ธฐ ํด์ผ ํ . ์ #3...
์บ์ฑ์ด ํ์ฑํ๋๊ธฐ ์ /ํ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ์ ์ก๋๋ ๋ ์ฝ๋ ์์ ์ฐจ์ด๋ ๋ช ๋ฐฑํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ทธ์ ๋ฐ๋ฅธ ์คํ ๋ฆฌ์ง ๋ก๋ ๊ฐ์์
๋๋ค.
์ ์ฒด๋ก
"์ผ์ผ ํ ๋ผ๋ฐ์ดํธ"๋ผ๋ ๋ง์ ์ ๋ง ๋ฌด์ญ๊ฒ ๋ค๋ฆฝ๋๋ค. ๋ชจ๋ ์ผ์ ์ฌ๋ฐ๋ฅด๊ฒํ๋ค๋ฉด ์ด๊ฒ์ ๋จ์ง 2^40๋ฐ์ดํธ / 86400์ด = ~12.5MB/s๋ฐ์คํฌํ IDE ๋์ฌ๋ ๊ณ ์ ๋์ด ์์ต๋๋ค. ๐
๊ทธ๋ฌ๋ ์ฌ๊ฐํ๊ฒ ๋งํ๋ฉด ํ๋ฃจ ๋์ ๋ก๋๊ฐ XNUMX๋ฐฐ๋ "ํธํฅ"๋์ด๋ ์ต์ SSD์ ๊ธฐ๋ฅ์ ์ฝ๊ฒ ์ถฉ์กฑํ ์ ์์ต๋๋ค.
์ถ์ฒ : habr.com