جستجوی ایمیل بهینه شده برای میلیون ها کاربر

سریع ، مقیاس پذیر و قابل اعتماد – چگونه می توان مشکل ثبت نام ایمیل را در مقیاس برای میلیون ها کاربر بدون به خطر انداختن عملکرد یا یکپارچگی داده ها حل کرد. ، در اینجا این معامله است.
هنگامی که با میلیون ها کاربر سر و کار دارید ، یک مشکل کوچک شروع به خوردن سیستم شما می کند – بررسی می کنید که آیا یک ایمیل از قبل وجود دارد. به نظر می رسد کوچک است ، اما اگر 10 میلیون بار این کار را انجام می دهید؟ رونق ، حافظه از بین رفته است. افت عملکرد خوب نیست
اما نگران نباشید. ما این را گرفتیم بیایید مقداری از redisbloom و postgresql را مخلوط کنیم و سیستمی بسازیم که سریع ، مقیاس پذیر باشد و تمام حافظه شما را جوید.
redisbloom: حافظه نجات دهنده احتمالی
-
راندمان حافظه: ایمیل های کامل را ذخیره نمی کند. این فقط از یک آرایه کمی و برخی از جادوی ریاضی (منطق فیلتر شکوفه) استفاده می کند. بنابراین ، 10 میلیون ایمیل = فقط حافظه 30 مگابایتی. بله شوخی نمی کند
-
دیوانه سریع: بررسی کنید که آیا یک ایمیل در زمان ثابت وجود دارد ، o (1). مثل چشمک زدن سریع.
-
سبک وزن: نیازی به ذخیره ایمیل های واقعی در Redis نیست. بار کمتر ، سرعت بیشتر. \
نزولی؟ خوب … مثبت کاذب ممکن است (1 ~).
خنک ، اما صادقانه بگویم – 1 ٪ مثبت کاذب هنوز هم یک مشکل است. بنابراین ، هنگامی که redisbloom فکر می کند ایمیل در حال حاضر وجود دارد ، ما فقط در PostgreSQL دو بار بررسی می کنیم.
postgresql: checker double قابل اعتماد
گردش کار: چگونه همه چیز جمع می شود
- بررسی مجدد را بررسی کنید: بررسی کنید که آیا ایمیل ممکن است وجود داشته باشد یا خیر. اگر redisbloom می گوید نه – ما خوب هستیم. به جلو حرکت کنید و ثبت نام کنید.
-
بررسی postgresql: اگر redisbloom می گوید “شاید” ، ما یک ساده اجرا می کنیم
SELECT 1
در Postgres فقط برای امنیت - در هر دو وارد کنید: اگر ایمیل در Postgres وجود ندارد ، آن را در هر دو Postgres و redisbloom وارد کنید تا آنها را همگام نگه دارید.
چرا کار خواهد کرد
-
کارآمد: Redisbloom بیشتر چک ها را انجام می دهد. رام را نجات می دهد. فوق العاده خراب
-
اعتماد به نفس: PostgreSQL نادر کاذب نادر را به خود جلب می کند. شما 100 ٪ دقت می کنید.
-
مقیاس پذیر: با 100 یا 100 میلیون کاربر صاف کار می کند. ضد آینده
-
ایمن: ما ایمیل های هش (SHA-256) را داریم ، بنابراین داده های ساده را در هیچ کجا ذخیره نمی کنیم.
تأثیر دنیای واقعی
اگر با حدود 10 میلیون ایمیل سروکار دارید ، استفاده از Redisbloom به معنای واقعی کلمه می تواند صدها مگابایت حافظه را نجات دهد. به جای ذخیره مستقیم هر ایمیل ، redisbloom تمام این موارد را در حدود 30 مگابایت فشار می دهد. این دیوانه کارآمد است.
از طرف دیگر ، PostgreSQL هنوز کار خود را با اطمینان انجام می دهد ، اما فقط وقتی واقعاً به آن احتیاج داریم. ما برای هر چک ، پایگاه داده را چکش نمی کنیم – فقط وقتی Redisbloom “شاید” را به ما می دهد. و حتی در این صورت ، ما فقط یک سبک وزن را انتخاب می کنیم ، که بسیار سریع است و هیچ داده غیر ضروری را نمی کشد.
برای عملکرد – هر بررسی مجدد تقریباً سریع است ، مانند حدود 0.001 تا 0.005 میلی ثانیه. PostgreSQL ممکن است یک قطعه طولانی تر ، شاید 0.005 تا 0.02 میلی ثانیه طول بکشد ، اما باز هم ، این فقط برای یک تکه کوچک از چک ها است. آنها را با هم ترکیب کنید و حتی اگر 10 میلیون چک انجام دهید ، در مدت چند دقیقه انجام می شود. بنابراین ،
-
شما حافظه زیادی را ذخیره می کنید
-
شما پایگاه داده خود را با پرس و جو غیر ضروری نمی سوزانید
-
سیستم ما حتی در مقیاس عظیم سریع و تمیز می ماند.
رونق این همان معماری خوب به نظر می رسد.
SHA-256: نگه داشتن ایمیل خصوصی
ایمیل های خام را ذخیره نکنید. قبل از ذخیره هر چیزی ، ما هر ایمیل را با استفاده از SHA-256 هش می دهیم ، بنابراین حتی اگر کسی وارد DB شما شود ، آنها قادر به خواندن آدرس های ایمیل نخواهند بود. لطفاً کد زیر را بررسی کنید ، امیدوارم که این قابل درک باشد.
async function **emailExists**(email: string): Promise\ {
const hash = hashEmail(email);
const mightExist = await redis.bf.exists('email\_bloom', hash);
if (!mightExist) return false;
const res = await pg.query(
'SELECT 1 FROM registered\_emails WHERE email\_hash = $1', \[hash]
);
return res.rowCount > 0;
}
async function **registerEmail**(email: string) {
if (await emailExists(email)) {
console.log('Email already exists.');
return;
}
const hash = hashEmail(email);
await pg.query(
'INSERT INTO registered\_emails (email\_hash) VALUES ($1)', \[hash]
);
await redis.bf.add('email\_bloom', hash);
console.log('Email registered!');
}
خلاصه
-
برای جستجوی سریع و کارآمد حافظه از redisbloom استفاده کنید.
-
برای بررسی دقیق و نهایی از PostgreSQL استفاده کنید.
-
ایمیل های خود را با SHA-256 برای حفظ حریم خصوصی هش دهید.
-
بهترین ها را از هر دو جهان بدست آورید: سرعت و صداقت.
این تنظیمات آزمایش شده توسط نبرد است. این مانند دسته کوچک موسیقی جاز کامل فست فود و سخت و سخت است. در مقیاس کار می کند ، به منابع شما احترام می گذارد و از کاربران شما محافظت می شود.
امتحانش کن مقیاس با اعتماد به نفس.