Gewusst wie-Seiten wie LinkedIn effizient display 1st/2nd/3rd-level-Beziehung neben jeder person den Namen?

Ich vor kurzem verkorksten Vorstellungsgespräch schlecht beantworten eine einfache Frage: wie kann Seiten wie LinkedIn effizient zeigen die Beziehung Distanz (1./2./3.) von Ihnen jede person, die auf einer Seite angezeigt (z.B. in Personen-Suche Ergebnisse, die Liste der Leute in einer Firma arbeitet, etc.)?

<EDIT> ich bekam den wesentlichen "trick" die Lösung: Suche nach "Abstand von mir" ist eine gemeinsame operation (z.B. 20x+ auf einer einzigen Seite, 100 pro login-session), so kann ein Teil der "Abstand von mir zu X", Zwischenspeichern, und dann wieder verwenden, die Cache Teilergebnis viele Male in Reihenfolge zu make andere Operationen viel billiger. Ich vermutete auch, dass die teilweise Ergebnis war wahrscheinlich meine zweite-Ebene-verbindungen, weil "cache alle 3rd-level-verbindungen" wäre zu teuer in RAM und CPU.</EDIT>

Aber wenn Sie versuchen zu konvertieren, das Einblick in eine Lösung, ich kam mit einem stümperhaften Antwort mit erstellen von persistenten caches 2nd-level-verbindungen von jedem auf der Website (die hätte enorm epensive im perf und Komplex zu halten), und ich nahm einen unerklärlichen Umweg in Bloom-Filter in einer Weise, die wenig technischen Sinn. Ich würde nicht gemietet haben, selbst nach einer Antwort wie, die!

Später, als ich dachte über das problem, ohne den Druck des Vorstellungsgesprächs hängt über meinem Kopf, kam ich auf eine vernünftige Antwort.

  • Bauen ein sehr schneller Weg, um die erste Ebene der verbindungen für jede charge von Benutzer-IDs (batch-Größe von bis zu ~1000?). Dies bedeutet wahrscheinlich eine dedizierte cluster von lose-von-RAM-Server, die in den cache-Speicher das gesamte Netzwerk der 1st-level-verbindungen im Speicher. Zum Glück, 50M-Mitglieder x avg. 100 verbindungen pro Mitglied x 4 Byte pro Element-ID = <25 GB an cache im RAM, das ist machbar mit preiswerten hardware. Und die Anzahl der änderungen pro Tag zu unter 1%, so halten Sie die cache-up-to-date ist nicht allzu schwer. (Beachten Sie, dass eine relationale Datenbank wäre wohl eine schlechte Wahl zu implementieren, die diesen cache, weil die "viel random I/O" Zugriff Muster tötet relationalen DB-Leistung.)

  • wenn sich ein Benutzer anmeldet, cache seine 2nd-level-verbindungen durch das Holen von 1st-level-verbindungen von jedem 1st-level-verbindungen, und den stick in eine hashtable (key = 2nd-level-ID, Wert = array mit 1st-level-verbindungen, die verbinden Sie). Auch cache der first-level-verbindungen zu, so können Sie sich zurück ziehen beide 1st - und 2nd-level über einen einzigen Anruf wieder zu Ihrem remote-cache-server. Benutzer-IDs sind leicht teilbaren, also eine verteilte Caches wie memcached kann funktionieren gut für diese.

  • für jede Benutzer-ID, zu finden, ob es in Ihrem "Netzwerk" und in welcher Beziehung er zu Ihnen (1., 2., 3.), tun Sie den folgenden:

    1. wenn die ID in Ihrem first-level-verbindungen, stop.
    2. versuchen, suchen Sie die ID in Ihrem Cache 2nd-level-verbindungen hashtable. Wenn gefunden, gib den array von verbindungen, die verbinden.
    3. holt den ID der ersten Ebene-verbindungen, und wiederholen Sie Schritt 2 für jeden von Ihnen. Zusammenfassen aller Ergebnisse in einem einzigen array und gibt Sie zurück.
    4. <EDIT> umgestalten in eine batch-Umsetzung ("look-up-Entfernung von mir bis zu N verschiedene Nutzer"), so können Sie die remote-Ergebnisse von Schritt #3 die zimmerreserviereung, ohne das make up zu N remote-Aufrufe.</EDIT>

Aber ich bin sicher, es gibt bessere Antworten auf diese. Was ist deins? Wenn Sie möchten, dass zusätzliche Herausforderung, versuchen Sie die Simulation ein inteview situation (can ' T look up-Lösungen auf dem Web).

Beachten Sie, dass die Frage war über eine optimale Lösung, unabhängig von wie LinkedIn tatsächlich tut Sie es heute, die ich sah, nachdem ich schrieb meine Antwort oben.

  • Ich hoffe, dass Sie die Anwendung wurden bei LinkedIn oder Ihre Mitbewerber (oder einem Ort verwenden möchte, dass die Technik für etwas). Wenn nicht, klingt wie der interviewer wusste nicht wirklich, was er oder Sie tut---was schade ist.
  • Yep, effiziente Analysen von sozialen Netzwerken war ein wichtiger Teil dieses Unternehmens, so dass diese Frage hatte praktische Relevanz. Plus ich denke, es ist eine vernünftige Allgemeinen test anwenden zu können, theoretische informatik-Ideen in einem realen Umfeld, wo Dinge wie RAM vs. I/O-Geschwindigkeit, hardware-Kosten vs. Programmierer Aufwand, und die lokale vs. remote-Platzierung von code sehr wichtig. Der Nachteil, natürlich, ist, herauszufinden, eine gute Lösung (wenn Sie nicht bereits vertraut mit dem problem) habe ich mehr als 5 Minuten!
  • "Ich würde nicht gemietet haben, selbst nach einer Antwort und so!" - Dort gewesen, getan, dass
InformationsquelleAutor Justin Grant | 2009-10-12
Schreibe einen Kommentar