Technologie, die Japans größte Jobsuchmaschine "Standby" unterstützt
https://speakerdeck.com/marevol/ri-ben-zui-da-ji-falseqiu-ren-jian-suo-enzin-sutanbai-wozhi-eruji-shu
Über die Standby-Suchfunktion
--Standby: Suchen Sie nach mehr als 8 Millionen verschiedenen Jobinformationen gleichzeitig
- Der Suchserver ist ein Elasticsearch-Cluster (+ Plug-In)
- Elasticsearch
- Im Standby-Modus ist es einfach, Knoten in einem Cluster zu verwalten und mit Plug-Ins zu erweitern.
- Datenknoten (Index)
- Such-API ⇒ Koordinierungsknoten (für die Suche)
- Spark / Update Batch ⇒ Koordinationsknoten (zur Aktualisierung)
- Da die Aktualisierungshäufigkeit hoch ist, werden Suche und Aktualisierung getrennt, damit die Suche nicht zusammenfällt.
--Suchtyp
- Stichwortsuche: Volltextsuche nach Titel, Beschreibung, Arbeitszeit usw.
- Suche nach Arbeitsorten: Suche nach Standortinformationen nach Konvertierung des Arbeitsorts in Breiten- und Längengrade
- In Lucene ist der Suchpunkt (Erstellung des Translokationsindex) mit Analyzer zu tun.
- CharFilter: Zeichen für Zeichen konvertieren (Beispiel: ①⇒1)
- Tokenizer: In Wörter teilen
- TokenFilter: Wort für Wort konvertieren (z. B. lange Noten schneiden, Hilfswörter schneiden)
- Wo kann Analyzer verwendet werden?
- Wird zum Suchen und Indizieren verwendet, muss jedoch nicht unbedingt derselbe Analysator sein
- Serie: Einführung in OSS Full Text Search Server Fess
Standby-Index und Abfrage
- Angemessene Bewertung und Vermeidung von Auslassungen
- Morphologische Analyse + Yomigana * Für jedes der drei Bi-Gramm wird ein Index erstellt
- Copy_to, um einen Index in anderen Analysatoren zu erstellen (Mehrfachfelder sind in Ordnung, aber keine zusätzlichen Felder)
--Abfrage
- oder suchen
- Phrase (behält die Wortreihenfolge bei) multi_match (löst Abfragen für mehrere Felder aus), job_title, job_content, bigram_content, read_content (gewichtet, zB) job_title: 0.8)
- minimum_should_match: Die Wortreihenfolge ist unterschiedlich, sie trifft auch dann, wenn es ein wenig dauert (selbst wenn Sie in einem Satz suchen, können Sie ihn so aufnehmen, wie er ist, und 0 Treffer vermeiden), gewichten Sie ihn auf 0,01 und geben Sie der Phrase Priorität
--Elasticsearch-Erweiterung: Sie können einen Einstiegspunkt erstellen, der neue Pfade akzeptiert
- Es hängt von der Version von Elasticsearch ab, daher funktioniert es nicht wie in der nächsten Version ...
Suchprobleme und Antworten
- Verwenden Sie den Mechanismus, um Schnappschüsse zu erstellen, verwenden Sie die wiederhergestellte Umgebung zum Analysieren und Lernen (derzeit gibt es keine Aggregation, die Echtzeitleistung erfordert).
- Erhältlich jede Stunde innerhalb eines Tages, tägliche Einheit innerhalb von 2 Wochen und verdünnt auf 1 pro Monat für mehr (gespeichert in S3)
- Ursprüngliche Ähnlichkeit
- Ich möchte die Punktzahl senken, obwohl ich SEO-Maßnahmen ergriffen habe (z. B. solche mit übereinstimmenden Keywords, die zu häufig vorkommen).
- Hergestellt durch Erben der BM25-Ähnlichkeit
- Verteilung von Wörterbuchdateien
- Kann auf NFS montiert werden
- Das ConfigSync-Plug-In wurde eingeführt, weil ich Dateien mit einer API wie REST verteilen wollte
- Ich möchte Geschäftslogik und Suchanfragen separat verwalten
- Ich möchte ein wenig Logik schreiben, deshalb habe ich das Skript-basierte Suchvorlagen-Plug-In + Velocity-Vorlage eingeführt
- Ich möchte die Wörterbuchdatei ohne Neustart neu laden
- Suchergebnisse sortieren
- Ich möchte verhindern, dass derselbe Jobname und das gleiche Medium nebeneinander angezeigt werden
- Verbessern Sie sogar den oberen Teil der Suchergebnisse
- Eingeführtes DynaRank-Plug-In: Sortieren Sie die Top-N-Treffer
- Eingeführtes Minhash-Plug-In: Indizieren Sie die Bitfolge des Jobtitels, beurteilen Sie die Ähnlichkeit anhand der Bitfolge und sortieren Sie sie
- Ich möchte die Indexeinstellungen und die Zuordnung ändern, ohne anzuhalten
- Indizierungsproxy speichert Aktualisierungsanforderung in Datei, spiegelt Index in einem anderen Thread wider
- Neu indizieren in neuen Index, kopieren und dann aus der Datei in einen neuen Index schreiben
- Alias durch neuen Index ersetzen, alten Index löschen
Maschinelles Lernen
- Schätzung des Jobtyps / der Branche
- Die Jobinformationen enthalten kein eindeutiges Berufsfeld
- Extrahieren Sie die Merkmale des Jobs durch Verarbeitung natürlicher Sprache, lernen Sie die Merkmale und schätzen Sie den Berufstyp, verwenden Sie Chainer
- Jährliche Einkommensschätzung
- Da es Fälle gibt, in denen das Jahreseinkommen nicht bekannt gegeben wird, werden die Merkmale des Stellenangebots extrahiert und die Merkmale zur Schätzung des Jahreseinkommens gelernt.
von jetzt an
- Erhöhen / Verringern der Anzahl der Knoten durch automatische Skalierung
--Optimierung der Suchergebnisse durch Learning To Rank
- Anwendungen wie Word2Vec
Fragen und Antworten
――Was ist Ihre Bewertung von Query Turing?
- Ich suche und schaue es mir an und wenn etwas schief geht, sinkt die Klickrate.
Java10 Zusammenfassung und was passiert mit Java11
https://www.slideshare.net/nowokay/java10-and-11
Unterstützung
- Es wird nicht mehr über die Version des Jahres und des Monats gesprochen, und die Hauptversion wird wie zuvor erhöht
--Wartungsversion wird überarbeitet (10.0.1 im April, 10.0.2 im Juli), Nebenversion ist immer 0
--JDK 11 LTS für 2018/9 (LTS wird dem Versionsnamen hinzugefügt)
- Der Java SE 8-Support wurde bis 2019/1 (3 Monate nach der Veröffentlichung von JDK11) verlängert. Einzelne Benutzer werden ihn bis 2020/12 unterstützen
- JDK 11 oder höher
- Applet und Web Start werden von JDK 11 nicht mehr unterstützt
- JavaFX wird nicht mehr gebündelt (die Entwicklung scheint voranzukommen), ursprünglich wurde es nicht in OpenJDK gebündelt
- AWT / Swing engagiert sich aktiv für JDK 11 (Korrekturen statt Verbesserungen)
JDK10
- Die auffälligste Änderung sind Inferenzen vom Typ lokaler Variablen
- var ist kein Schlüsselwort, sondern ein spezieller Typ (eine Variable / Methode namens var kann definiert werden, eine Klasse namens var kann jedoch nicht mehr definiert werden)
- Verwendungsbeispiel: Weisen Sie einer Variablen eine anonyme Klasse zu, wenn der Typname wie new ArrayList <> () auf der rechten Seite geschrieben ist (ich denke, es ist besser, var nicht für umschlossene Typen wie Optional / Flux zu verwenden).
- Java-Based JIT Compiler, Project Metoropolise (Graal)
- Prarell Full GC for G1
- Erstens sollte keine vollständige GC stattfinden, aber ...
- Heap Allocation on Altenative Memory Devices
- Heap kann jetzt einem nichtflüchtigen Speicher wie 3D Xpoint zugewiesen werden
- OpenJDK enthält jetzt auch Root-Zertifikate
- API Changes
- java.io.Reader transferTo(Writer)
- Jetzt können Sie die Prozess-ID erhalten
- java.util.List/Map/Set copyOf(Collection)
- toUnmodifiableList/Set/Map
- Reduzierte Notwendigkeit, Guave zu verwenden
- Betrachtet nun die CPU-Anzahl / Speichergröße richtig
--32bit Version von JDK wird nicht mehr gebündelt
JDK11
- Launch Single-File Source-Code Programs
- Wenn Sie einen Quellcode haben, müssen Sie nicht kompilieren
- java Hello.java
- Raw String Literals
+Wir diskutieren, wie mit Einrückungen umzugehen ist, und es ist möglicherweise nicht möglich, wenn es nicht organisiert ist
- Switch Expression
+Außerdem können für den Fall mehrere Werte geschrieben werden
- Local-Variable Syntax for Lambda parameters
- HTTP Client
- Epsilon: A No-Op Garbage Collector
+Dies ist möglicherweise gut für Serverless, einen Standard zur Bewertung der GC-Leistung.
-Java EE und CORBA kommen heraus
-Flight Recorder ist jetzt Open Source
-Unterstützt Unicode 9 und Unicode 10
- Nestmate
+Projekt Valhalla Ergebnisse
- String
- repeat():Nehmen Sie im Voraus einen Speicherbereich für die Anzahl der Zeichen
- strip(): Der Raum in voller Breite wird ebenfalls gekürzt
- lines()
+Erforderlich für die Implementierung von Raw Literal
- Predicate::not
Support
- OracleJDK
+Sehr teuer für Webdienstleister
- 100 Servers on AWS ->100 Millionen Yen (auf Preislistenbasis)
- OpenJDK
+Wird nur 6 Monate ab jeder Version unterstützt (Sicherheitspatch bereitgestellt)
+OpenJDK hat möglicherweise auch LTS, sagt Mark Reinhold, aber es gibt keine offizielle Ankündigung, es kann keine Überlappung geben, selbst wenn LTS enthalten ist
- AdoptOpenJDK
+IBM Sponsor, London JUG
+Bietet 4 Jahre LTS-Unterstützung
- Zulu
- 100 servers $28,750/year
- Unlimited servers $258,750/year
##Ich möchte eine Microservice-Architektur auch mit einem alten Framework haben
https://docs.google.com/presentation/d/1OZFgxuJQacfTc-3SY-ldxEE4OM3KUaUocdwIdkmy1z8/edit#slide=id.g3b5fd37ef4_0_83
-Ich möchte einen alten Dienst in einen Mikrodienst einfügen
+Reduzieren Sie die Betriebslast (stellen Sie sie auf eine gemeinsame Plattform)
+Teilen Sie die Dienste auf, um den Austausch zu vereinfachen
Spring Cloud Config
- Netflix Eureka:Service Discovery (internes DNS)
-Spring Cloud Config: DB-Verbindungszeichenfolge usw. speichern
-Ich möchte Spring Cloud Config beim Start auch mit älteren Diensten als Spring Boot laden
- RibbonClient
+Caching-Anwendungsinformationen zu Eureka
+Lastausgleichszugriff auf Dienste
- Eureka Client
+Eureka Client im Ribbon Client enthalten
+Minimale Funktionalität ohne Lastausgleich und Rückgabe des Speicherorts des Zielservers für den Dienstnamen
- eureka.registration.enabled=Wird mit false verwendet
+Die im vorhandenen Framework verwendeten Anwendungsinformationen des Eureka-Clients im Ribblon-Client werden nicht mehr aktualisiert (Scale-In ist nicht möglich).
+Ich habe zwei Singleton-Sachen aktualisiert
+Selbst wenn ich aus dem DI-Container komme, werden Seasar- und Spring DI-Container im Krieg gemischt, so dass ich es nicht von der Seasar-Seite bekommen konnte.
-Holen Sie sich Daten, indem Sie die REST-API von Eureka direkt mit dem HTTP-Client ohne Verwendung des Eureka-Clients aufrufen
Spring Cloud Stream(Apahce Kafka)
-Ich möchte eine Nachbearbeitung zu einer Verarbeitung mit altem Service hinzufügen
+Push-Benachrichtigung, Mail-Sendefunktion
+Ich möchte nicht dieselbe Verarbeitung schreiben, die in anderen Diensten verwendet wird, sondern eine gemeinsame Verarbeitung für jeden Dienst
+Wenn Sie es zu einem Modul machen, müssen Sie es an das Formular anpassen, das in alten Diensten verwendet werden kann
+Ich möchte, dass es asynchron ausgeführt wird
-Verwenden Sie Apache Kafka (1 Quelle, 2 Waschbecken)
-Themendesign
+Beispiel: Push-Benachrichtigung nach einer Funktion
+Machen Sie "was Sie getan haben" Tipic, zB) like / follow / post ("Drücken Sie JJJ auf XXX"Thema nicht machen)
-So ändern Sie den Nachrichteninhalt
+Es ist besser, ein neues Thema zu erstellen
+Nachdem die Quellseite Nachrichten an das neue Thema gesendet hat, verweist die Sink-Seite auf das neue Thema.
##Beispiel für die Verwendung von gRPC im Werbegebotssystem von Logicad, das 160.000 Anfragen pro Sekunde verarbeitet
https://www.slideshare.net/hiroiso/logicad16grpc
- Sonet Media Networks:Bereitstellung des DSP-Geschäfts (Logicad)
- Real-Time Bidding
+SSP verwaltet das Inventar auf Websites
+DSP-Unternehmen fordern Angebote an
+Wenn eine Zeitüberschreitung auftritt, können Sie nicht an der Auktion teilnehmen (es handelt sich nicht um einen Verkauf). ⇒ Reduzierung der Latenz+Verbesserter Durchsatz
-Latenz
+Muss innerhalb von maximal 100 ms zurückgegeben werden
+Netzwerklatenz (Tokio-Tokio 1)-2 ms, Tokio-Taiwan 65 ms)+Latenz der Gebotsverarbeitung
+Die Logicad-Gebotsverarbeitung dauert durchschnittlich 3 ms
+Verarbeitet ca. 160.000 Durchsatz pro Sekunde
-Architekturkonfiguration
+Dutzende von Nginx- und Bieterservern haben eine Netzstruktur
+Werbeartikelinformationen (Bild-URL, Größe, LP usw.) werden aufgrund der Latenz lokal gespeichert
- Aerospike(KVS):Benutzerinformationen, Informationen zur Verdauung des Werbebudgets
- AWS RDS:Werbekampagneninformationen (vordefiniert, speichert Informationen, die regelmäßig geladen werden müssen)
- Redis:Informationen zu Anzeigenbetrug (Bot-Urteil, speichert Informationen von Drittanbietern)
-Vor der Einführung von gRPC
+Alle Server verfügen über dieselben Werbeartikelinformationen und müssen mit zunehmender Datenmenge vergrößert werden
+TB-Klassendaten (Anzahl der Produkte in der Größenordnung von 100 Millionen) überschreiten die Größe, die von jedem Server gehalten werden kann
-Einrichten eines Werbeartikel-Informationsservers unter Beibehaltung von Latenz und Durchsatz
+Lastausgleich ist ebenfalls erforderlich
+Der Gebotsserver ist ein gRPC-Client, und ein Werbeartikelinformationsserver mit einer Clusterkonfiguration wird als gRPC-Server (Java8) erstellt.
gRPC
-Kandidaten zur Auswahl
+Redis: Arbeitet in einem einzelnen Thread, was sich auf den Durchsatz auswirkt (Blöcke)
+Aerospike: Daten sind gespalten und wirken sich auf die Latenz aus (Mehrfachkommunikation, Multithreading erhöht Thread-Verbindungen)
- gRPC +Lokale DB: Rekrutierung
- gRPC
+Von Google entwickeltes schnelles RPC-Framework
- HTTP/2,Beschleunigen Sie mit Protokollpuffern
- Google, Netflix, Docker,Cisco usw.
-Gute Punkte von gRPC
+Reduzierte Latenz: HTTP/2 (binärer Frame, Header-Komprimierung durch Indizierung, nicht SSL), Protocaol-Puffer (Datenkomprimierung)
+Durchsatz: HTTP/2 (Multiplexing), clientseitiger Lastausgleich
- h2c
- HTTP/2 über TCP: Kann nicht mit einem Browser verwendet werden, kann jedoch eine Kommunikation übernehmen, die kein TLS verwendet, wenn es sich nur um ein internes Netzwerk handelt.
-Multiplexing
+Parallelisierung ist auch bei Zehntausenden von Verbindungen mit einer TCP-Verbindung möglich. Der Overhead wie 3-Wege-Handshake kann reduziert werden und wird nicht blockiert
- Protocol Buffers
+Google Serializer
- IDL
+Die Komprimierungsrate ist höher, wenn entworfen wird, um numerische Typen anstelle von Zeichenfolgen zu verarbeiten, wobei Tags verwendet werden, ohne Feldnamen als Daten zu haben.
-Clientseitiger Lastausgleich
+gRPC Client Name Resolver(DNS)Erweitert die Unterstützung der dynamischen Erhöhung / Verringerung des gRPC-Servers (Aktualisierung der Serverliste durch API oder regelmäßige Ausführung)
+Einfache Verwaltung ohne externen Load Balancer wie Nginx
###Ergebnis der tatsächlichen Anwendung von gRPC
-Benchmark
+Stresstest nur des Werbeartikel-Informationsservers (maximaler Durchsatz, Messung von Änderungen in der Anzahl der Verbindungen)
+Messung von Latenz und Durchsatz in einer Lasttestumgebung (eine Reihe von Gebotsverarbeitungen)
-Es ist möglich, mit JMeter auch mit gRPC eine Last aufzubringen
+Es ist möglich, eine Klasse vorzubereiten, die JavaSamplerClient implementiert, und ein beliebiges Protokoll anzufordern.
-Lade Test
- Java8, 128GB, 8Coe/16thread
+100 Millionen Fälle, 1.6TB
+Wir konnten problemlos Zehntausende von Fällen pro Sekunde bearbeiten ⇒ 3 Werbeproduktinformationsserver-4 Einheiten verfügbar
+Die Anzahl der Verbindungen war konstant und nicht proportional zum Durchsatz (Multiplexing ermöglicht die Verarbeitung mit weniger TCP-Verbindungen).
-Trotz Externalisierung der lokalen Verarbeitung ändern sich etwa 10% (0).Es war innerhalb von 1 ms)
##Die Geschichte einer Serveranwendung mit DDD und sauberer Architektur
-Eilbau funktioniert nicht
+Der Umriss der Spezifikation wurde festgelegt, einige der Kernfunktionen hatten Teile, daher möchte ich so schnell wie möglich sehen, was mit ihnen funktioniert
+Das Prototyping wurde fortgesetzt, während Funktionsspezifikationen erstellt wurden
+Ich wurde sehr gedrängt und der Prototyp sollte ein Produktionscode werden. ⇒ Ich konnte ihn nicht veröffentlichen
-Verschiedene Überlegungen
+Laden Sie alle Clients vom Server herunter und verarbeiten Sie sie (abnormales Verkehrsaufkommen, erhöhte Client-Verarbeitungslast).
+Die Reflexion von Spezifikationsänderungen des externen Kooperationsziels spiegelt sich in allen Komponenten wider
+Es gibt keine Komponente, die den Hauptteil der Geschäftslogik darstellt, und jede Komponente kann sich nicht auf die Kernlogik konzentrieren und trägt den Konvertierungsprozess
###Design
-Designauftrag
+Aufzugsneigung definieren
+Definieren Sie Funktionsspezifikationen und Verwendungsszenarien (definieren Sie auch nichtfunktionale Anforderungen).
+Robustheitsanalyse
+Begrenzten Kontext extrahieren
+Erstellen einer Kontextkarte
-Robustheitsanalyse
+Erstellen Sie im Voraus ein Anwendungsfallszenario
+Überlegen Sie, wie Sie eine Funktion erstellen, die dem Szenario entspricht
+Drücken Sie es mit Grenzen (Bildschirme, Cron), Entitäten (zu verwaltende Daten), Steuerelementen (Verarbeitung, Benutzerauthentifizierung, Werterfassung usw.) aus.
+Handgeschrieben, geschrieben und gelöscht im Notizbuch und adoptierte denjenigen, der von zwei Personen gut zu analysieren scheint
-Kontextkarte
+Sammeln Sie für die Funktionen, die im Robustheitsdiagramm angezeigt werden, ähnliche Funktionen und definieren Sie einen "begrenzten Kontext".
+Schreiben → korrigieren → schreiben → korrigieren
+Sorgfältige Beurteilung der Beziehungen zwischen Kontexten (Partnerschaft, Kunde/Lieferant, Adapter)
-Allgegenwärtige Sprache
+Legen Sie für jeden Kontext eindeutige Begriffe fest
+Als System ist es einfacher zu verstehen, ob die Begriffe zwischen Kontexten vereinheitlicht sind, und wir verwenden nicht dieselben Begriffe in unterschiedlichen Kontexten mit unterschiedlichen Bedeutungen.
+Ich habe auch beschlossen, es im Programm zu benennen → Dies ist beliebt
###Dinge, die vor der Implementierung vorbereitet werden müssen
-Regel
+Git-Repository-Betrieb, Codierungsstandard, Paketkonfiguration, Rest-API-Standard, Protokollstufe
+Die Ausnahme definiert die Klasse in der Nähe des Ortes, an dem sie aufgetreten ist
-Perspektive der Überprüfung des Quellcodes
+Ist es einer anderen Person möglich, es zu warten, ist es in Zukunft erweiterbar, gibt es keine Verschwendung, ist der Einflussbereich zu groß? ⇒ Im Wiki beschrieben
+Sicherheit (Umschreiben von Instanzvariablen der Autowired-Klasse, wird der Cache-Ablauf berücksichtigt?)
-Architektur in jedem Kontext
###Architektur in jedem Kontext
-Schnittstellenschicht
- Controller: Request
- Presenter: Response
- Gateway: Storage,Externer Service
+Übersetzer für jeden (übersetzt Wörter aus Ihrer Domain in Wörter von außerhalb)
-Usecase-Ebene
-Domänenschicht
- Entity, ValueObject, Service, Repository
-Veröffentlichte Sprache: Definiert Eingabe- / Ausgabedaten des Kontexts. Jeder Kontext verwendet die Klasse unter pl des Angerufenen
-Bibliothek: Eine Bibliothek, die es wert ist, in mehreren Kontexten geteilt zu werden, ohne an der Geschäftslogik beteiligt zu sein
-Repository-Implementierung
+Definieren Sie nur die Schnittstelle in Domain und verarbeiten Sie sie tatsächlich in Gateway
+Domain Repository ist Tabelle und 1:1 Definiert, um nicht zu korrespondieren (Definiert, um nicht zu wissen, wo es tatsächlich gespeichert ist)
+Gateway definiert den physischen Teil
###Was ich nach der Implementierung gefunden habe
-Sie können sich auf Ihre Interessen konzentrieren
- @Der Bereich, über den Sie in Transactional nachdenken müssen, kann eng sein
+Da die Begriffe einheitlich sind, können Sie eine eindeutige Verbindung zwischen externen Spezifikationen und Code herstellen
-Einfach zu verfolgen, da der Verarbeitungsablauf strukturiert ist
-Sturm der Bekehrung ...
-Gute Sache
+RDB ist frei von Monolithen und ermöglicht es jeder Person, sich auf die Geschäftslogik ihres Teils zu konzentrieren/Klarer Verantwortungsbereich mit Cache-Trennung (DB kann als meine eigene verwendet werden)
+Herausforderung für neue Technologien: Docker, AWS ECS(Ich wollte Fargate sein, bin aber nicht nach Japan 200 gekommen-Verlassen, da 300 ms Latenzzeit besteht), GitLab CI
-Es gibt Raum für Verbesserungen
+Gründliche Regeln