240M 도메인 이름 자동완성, p99 0ms* 달성
P99 0 ms* autocomplete for 240M domain names
Wirewiki.com을 운영하는 개발자가 2억 4천만 개의 도메인 이름을 대상으로 한 자동완성 기능을 p99 0ms* 지연 시간으로 구현한 방법을 공개한다. 사용자가 키를 누르는 순간 다음 키 입력까지의 시간을 활용해 미리 결과를 가져오는 프리페칭 전략과, 인메모리 트라이(Trie)와 SSD 기반 메모리 매핑 블록 인덱스를 결합한 하이브리드 데이터 구조를 사용한다. 부하 테스트 결과 API는 대부분 2ms 이내에 응답하며, 1.6k req/s에서도 p99 15ms를 유지한다. 저자는 단일 서버로도 충분하지만, 미국 등 원거리 사용자에게는 네트워크 지연이 문제가 될 수 있어 다중 서버 구축 가능성도 언급한다.
p99 0ms는 사용자가 키를 놓기 전에 결과가 준비된다는 뜻입니다.
HN 토론
86- skybrian
이 자동완성은 존재하지 않는 도메인을 제안합니다. 그냥 아무거나 입력하면 뭔가 제안하지만, 실제로 그 도메인에 가 보면 레코드가 없습니다.
자동완성 상자의 한 가지 목적은 오타를 피하도록 도와주는 것 같은데, 그래서 이건 덜 유용합니다.
- chrismorgan
keyup을 사용하는 것은 말이 안 되고 사용자 기대와도 일치하지 않습니다. 작업을 트리거할 때(일반적인 타이핑 포함)는 항상 keydown만 사용해야 합니다. (음, 한 가지 예외가 있는데 이유는 저도 잘 모르겠습니다: 스페이스바를 눌러 버튼을 활성화하는 경우입니다. 이 경우 클릭이 릴리스에서 발생하는 것처럼 keyup에서 트리거되는 반면, Enter는 keydown에서 트리거됩니다.) Keyup은 게임에서 흔히 그렇듯이 키의 상태에 지속적으로 반응하는 경우에만 사용됩니다.
이것은 기능에도 영향을 미칩니다. 실제로 keydown 대신 keyup을 사용함으로써 지연 시간이 발생합니다. 기분이 나쁩니다.
- ViscountPenguin
안타깝게도 이 접근 방식은 호주에서는 그다지 좋게 느껴지지 않습니다. 확실히 지연 시간의 영향입니다.
이것을 최적화 문제로 접근하면 훨씬 더 나아질 수 있다고 생각합니다. 전체 알파벳 사전을 사용하되, 인기도에 따라 가중치를 둔 나머지 도메인 이름 트리를 최대한 많이 커버하는 잔여 예측을 추가하는 것입니다. 이 트리는 미리 만들어서 동일한 시스템에 저장할 수 있습니다. 그러면 호주에서도 p99 0ms를 달성할 수 있을 것입니다.
- oersted
평소처럼 keyDown에서 fetch를 트리거하고 응답이 도착하는 즉시 표시하면 되지 않나요?
키를 누르는 데 걸리는 시간은 API 지연 시간의 합리적인 목표라고 생각하지만, 여전히 임의의 목표입니다. keyUp까지 기다렸다가 표시하면 API가 더 빠른 경우 지연 시간이 더 추가됩니다. keyUp에 동기화한다고 해서 더 즉각적으로 느껴지지는 않습니다.
- kevmo314
네트워크 지연 시간을 더 줄이려면 각 트라이 노드를 파일로 저장하고, 해당 노드의 접두사 경로를 파일 이름으로 지정하면 됩니다. 그런 다음 수억 개의 파일을 R2에 덤프하세요.
이제 트래버설은 완전히 CDN 조회로 수행할 수 있습니다!