Technologie qui prend en charge le plus grand moteur de recherche d'emploi du Japon en «veille»
https://speakerdeck.com/marevol/ri-ben-zui-da-ji-falseqiu-ren-jian-suo-enzin-sutanbai-wozhi-eruji-shu
À propos de la fonction de recherche de veille
--Standby: recherchez plus de 8 millions d'informations professionnelles à la fois
- Le serveur de recherche est un cluster Elasticsearch (+ plug-in)
- Elasticsearch
- En veille, il est facile de gérer les nœuds dans un cluster, et il est facile d'étendre avec des plug-ins
- Nœud de données (index)
- API de recherche ⇒ Nœud de coordination (pour la recherche)
- Spark / Update batch ⇒ Coordination node (pour mise à jour)
- Comme la fréquence de mise à jour est élevée, la recherche et la mise à jour sont séparées afin que la recherche ne se réduise pas ensemble.
--Type de recherche
- Recherche par mot-clé: recherche en texte intégral pour le titre, la description, les heures de travail, etc.
- Recherche de lieu de travail: recherche d'informations de localisation après la conversion du lieu de travail en latitude et longitude
- Chez Lucene, que faire avec Analyzer est le point de recherche (création d'index de translocation)
- CharFilter: Convertit caractère par caractère (Exemple: ①⇒1)
- Tokenizer: divisez en mots
- TokenFilter: Convertir mot par mot (par exemple, couper de longues notes, couper des mots auxiliaires)
--Où utiliser Analyzer
- Utilisé pour la recherche et l'indexation, mais pas nécessairement le même analyseur
- Series: Introduction au serveur de recherche en texte intégral OSS Fess
Index et requête en veille
- Notation appropriée et éviter les omissions
- Analyse morphologique + Yomigana * L'index est créé pour chacun des trois bi-grammes
- Copy_to pour créer un index dans d'autres analyseurs (le multi-champ est bien, mais pas pour ajouter des champs supplémentaires)
--Requete
- ou rechercher
- Phrase (maintenir l'ordre des mots) multi_match (lancer à la requête pour plusieurs champs), job_title, job_content, bigram_content, reading_content (pondéré, par exemple) job_title: 0.8)
- minimum_should_match: L'ordre des mots est différent, il frappe même si cela prend un peu (même si vous recherchez dans une phrase, vous pouvez le ramasser tel quel et éviter 0 hits), le pondérer à 0,01 et donner la priorité à la phrase
--Elasticsearch extension: vous pouvez créer un point d'entrée qui accepte de nouveaux chemins
- Cela dépend de la version d'Elasticsearch, donc cela ne fonctionnera pas comme dans la prochaine version ...
Rechercher des problèmes et des réponses
- Utilisez le mécanisme pour prendre des instantanés, utilisez l'environnement restauré pour l'analyse et l'apprentissage (actuellement, il n'y a pas d'agrégation qui nécessite des performances en temps réel)
- Obtenu toutes les heures en 1 jour, tous les jours en 2 semaines et dilué à 1 par mois pour plus (stocké dans S3)
- Je souhaite baisser le score même si j'ai pris des mesures de référencement (comme celles avec des mots-clés correspondants apparaissant trop fréquemment)
- Fabriqué en héritant de la similarité BM25
--Distribution des fichiers de dictionnaire
- Peut être monté sur NFS
- Introduction du plug-in ConfigSync car je voulais distribuer des fichiers avec une API comme REST
--Modèle de recherche
- Je souhaite gérer la logique métier et les requêtes de recherche séparément
- Je veux écrire un peu de logique, j'ai donc introduit le plug-in de modèle de recherche basé sur un script + modèle de vélocité
--Je veux recharger le fichier du dictionnaire sans redémarrer
--Trier les résultats de la recherche
- Je veux éviter que le même nom de travail et le même support ne soient affichés côte à côte
- Améliorez même la partie supérieure des résultats de recherche
- Introduction du plug-in DynaRank: triez les N meilleurs hits
- Introduction du plug-in Minhash: indexez la chaîne de bits du titre du poste, jugez la similitude par la chaîne de bits et triez
--Je souhaite modifier les paramètres d'index et le mappage sans m'arrêter
- Le proxy d'indexation enregistre la demande de mise à jour dans le fichier, reflète l'index dans un autre thread
- Réindexer vers un nouvel index, copier puis écrire dans un nouvel index à partir d'un fichier
- Remplacer l'alias par un nouvel index, supprimer l'ancien index
Apprentissage automatique
- Estimation du type d'emploi / de l'industrie
- Il n'y a pas de domaine d'emploi / d'industrie unique dans les informations sur l'emploi
- Extraire les caractéristiques de l'emploi par traitement du langage naturel, apprendre les caractéristiques et estimer le type d'occupation, utiliser Chainer
- Estimation du revenu annuel
- Puisqu'il y a des cas où le revenu annuel n'est pas divulgué, les caractéristiques de l'offre d'emploi sont extraites et les caractéristiques sont apprises pour estimer le revenu annuel.
à partir de maintenant
--Augmentation / diminution du nombre de nœuds par mise à l'échelle automatique
- Optimisation des résultats de recherche en apprenant à classer
- Applications telles que Word2Vec
Questions et réponses
―― Quelle est votre évaluation de Query Turing?
- Je le cherche et le regarde à portée de main, et si quelque chose ne va pas, le CTR diminue.
Résumé de Java10 et qu'advient-il de Java11
https://www.slideshare.net/nowokay/java10-and-11
soutien
――Il n'est plus question de devenir une version annuelle et mensuelle, et la version majeure est incrémentée comme avant
--La version de maintenance augmente la révision (10.0.1 en avril, 10.0.2 en juillet), la version mineure est toujours 0
--JDK 11 LTS pour 2018/9 (LTS est ajouté au nom de la version)
- La prise en charge de Java SE 8 a été étendue jusqu'en 2019/1 (3 mois après la sortie de JDK11), les utilisateurs individuels prendront en charge jusqu'en 2020/12
--JDK 11 ou version ultérieure
- L'applet et Web Start ne sont plus pris en charge à partir du JDK 11
- JavaFX n'est plus fourni (le développement semble progresser), à l'origine il n'était pas intégré dans OpenJDK
- AWT / Swing est activement engagé pour JDK 11 (correctifs plutôt que améliorations)
JDK10
- Le changement le plus frappant concerne les inférences de type à variable locale
- var n'est pas un mot-clé, mais un type spécial (une variable / méthode appelée var peut être définie, mais une classe appelée var ne peut plus être définie)
- Exemple d'utilisation: assignez une classe anonyme à une variable, lorsque le nom du type est écrit sur le côté droit comme new ArrayList <> () (je pense qu'il vaut mieux ne pas utiliser var pour les types enveloppés tels que Optional / Flux)
- Java-Based JIT Compiler, Project Metoropolise (Graal)
- Prarell Full GC for G1
- En premier lieu, Full GC ne devrait pas se produire, mais ...
- Heap Allocation on Altenative Memory Devices
- Le tas peut maintenant être affecté à une mémoire non volatile telle que 3D Xpoint
- OpenJDK comprend désormais également des certificats racine
- API Changes
- java.io.Reader transferTo(Writer)
- Vous pouvez maintenant obtenir l'identifiant du processus
- java.util.List/Map/Set copyOf(Collection)
- toUnmodifiableList/Set/Map
- Besoin réduit d'utiliser la goyave
- Regarde maintenant correctement le nombre de CPU / la taille de la mémoire
- La version 32 bits de JDK n'est plus fournie
JDK11
- Launch Single-File Source-Code Programs
- Si vous avez un code source, vous n'avez pas à compiler
- java Hello.java
- Raw String Literals
+Nous discutons de la façon de gérer le retrait, et cela peut ne pas être possible s'il n'est pas organisé
- Switch Expression
+De plus, plusieurs valeurs peuvent être écrites au cas où
- Local-Variable Syntax for Lambda parameters
- HTTP Client
- Epsilon: A No-Op Garbage Collector
+Cela peut être bon pour Serverless, une norme pour évaluer les performances du GC.
-Java EE et CORBA se détachent
-L'enregistreur de vol est maintenant Open Source
-Prend en charge Unicode 9 et Unicode 10
- Nestmate
+Livrables du projet Valhalla
- String
- repeat():Prenez une zone de mémoire pour le nombre de caractères à l'avance
- strip(): L'espace pleine largeur est également coupé
- lines()
+Requis pour l'implémentation de Raw Literal
- Predicate::not
Support
- OracleJDK
+Très cher pour le serveur Web
- 100 Servers on AWS ->100 millions de yens (sur la base d'une liste de prix)
- OpenJDK
+Uniquement pris en charge pendant 6 mois à compter de chaque version (correctif de sécurité fourni)
+OpenJDK peut également avoir LTS, dit Mark Reinhold, mais il n'y a pas d'annonce officielle, il peut n'y avoir aucun chevauchement même si LTS est inclus
- AdoptOpenJDK
+Commanditaire IBM, London JUG
+Fournit 4 ans de support LTS
- Zulu
- 100 servers $28,750/year
- Unlimited servers $258,750/year
##Je souhaite avoir une architecture de microservice même avec un ancien framework
https://docs.google.com/presentation/d/1OZFgxuJQacfTc-3SY-ldxEE4OM3KUaUocdwIdkmy1z8/edit#slide=id.g3b5fd37ef4_0_83
-Je veux mettre un ancien service dans un micro service
+Réduisez la charge opérationnelle (placez-la sur une plateforme commune)
+Divisez les services pour faciliter le remplacement
Spring Cloud Config
- Netflix Eureka:Service Discovery (DNS interne)
-Spring Cloud Config: enregistrer la chaîne de connexion DB, etc.
-Je souhaite charger Spring Cloud Config au démarrage, même avec des services plus anciens que Spring Boot
- RibbonClient
+Mise en cache des informations d'application sur Eureka
+Accès à l'équilibrage de charge aux services
- Eureka Client
+Client Eureka inclus dans Ribbon Client
+Fonctionnalité minimale qui n'équilibre pas la charge et renvoie l'emplacement du serveur cible pour le nom du service
- eureka.registration.enabled=Utilisé avec faux
+Les informations d'application d'Eureka Client dans Ribblon Client utilisées dans le framework existant ne sont plus mises à jour (le scale-in n'est pas possible)
+J'ai mis à jour deux trucs Singleton
+Même en sortant du conteneur DI, les conteneurs Seasar et Spring DI sont mélangés dans la guerre, donc je ne pouvais pas l'obtenir du côté de Seasar.
-Obtenez des données en accédant directement à l'API REST d'Eureka à l'aide du client Http sans utiliser le client Eureka
Spring Cloud Stream(Apahce Kafka)
-Je souhaite ajouter un post-traitement à certains traitements avec l'ancien service
+notification push, fonction d'envoi de courrier
+Je ne veux pas écrire le même traitement que celui utilisé dans d'autres services, traitement commun pour chaque service
+Si vous en faites un module, vous devrez l'adapter à la forme qui peut être utilisée dans les anciens services
+Je veux qu'il soit exécuté de manière asynchrone
-Utiliser Apache Kafka (1 source, 2 puits)
-Conception du sujet
+Exemple: notification push après une fonction
+Faites "ce que vous avez fait" Tipic, par exemple) comme / follow / post ("Poussez YYY à XXX"Ne faites pas de sujet)
-Comment changer le contenu du message
+Il vaut mieux créer un nouveau sujet
+Une fois que le côté source a commencé à envoyer des messages au nouveau sujet, le côté récepteur fait référence au nouveau sujet.
##Exemple d'utilisation de gRPC dans le système d'enchères publicitaires de Logicad qui gère 160000 demandes par seconde
https://www.slideshare.net/hiroiso/logicad16grpc
- Sonet Media Networks:Fournir des activités DSP (Logicad)
- Real-Time Bidding
+SSP gère l'inventaire sur les sites Web
+Les entreprises DSP demandent des offres
+Si un timeout survient, vous ne pouvez pas participer à l'enchère (cela ne devient pas des ventes) ⇒Réduction de la latence+Débit amélioré
-Latence
+Doit être retourné dans un délai maximum de 100 ms
+Latence du réseau (Tokyo-Tokyo 1)-2 ms, Tokyo-Taiwan 65 ms)+Latence du traitement des enchères
+Le traitement des enchères Logicad dure en moyenne 3 ms
+Traite environ 160000 débit par seconde
-Configuration de l'architecture
+des dizaines de serveurs nginx et d'enchères ont une structure maillée
+Les informations sur les produits publicitaires (URL de l'image, taille, LP, etc.) sont conservées localement en raison de la latence
- Aerospike(KVS):Informations utilisateur, informations sur la digestion du budget publicitaire
- AWS RDS:Informations sur les campagnes publicitaires (prédéfinies, stockent les informations qui doivent être chargées régulièrement)
- Redis:Informations sur la fraude publicitaire (jugement de bot, stocke les informations fournies par un tiers)
-Avant d'adopter gRPC
+Tous les serveurs ont les mêmes informations sur les produits publicitaires et il est nécessaire de passer à l'échelle à mesure que la quantité de données augmente
+Les données de classe TB (100 millions de commandes de produits) dépassent la taille que peut contenir chaque serveur
-Pour configurer un serveur d'informations sur les produits publicitaires tout en maintenant la latence et le débit
+L'équilibrage de la charge est également requis
+Le serveur d'enchères est un client gRPC et un serveur d'informations sur les produits publicitaires avec une configuration de cluster est construit comme un serveur gRPC (Java8).
gRPC
-Candidats à la sélection
+Redis: fonctionne dans un seul thread, ce qui affecte le débit (blocs)
+Aerospike: les données sont fragmentées et affectent la latence (plusieurs communications se produisent, le multithreading augmente les connexions de thread)
- gRPC +Base de données locale: recrutement
- gRPC
+Framework RPC rapide développé par Google
- HTTP/2,Accélérez avec les tampons de protocole
- Google, Netflix, Docker,Cisco etc.
-Bons points de gRPC
+Latence réduite: HTTP/2 (trame binaire, compression d'en-tête par indexation, non SSL), tampons Protocaol (compression de données)
+Débit: HTTP/2 (multiplexage), équilibrage de charge côté client
- h2c
- HTTP/2 sur TCP: ne peut pas être utilisé avec un navigateur, mais peut adopter une communication qui n'utilise pas TLS s'il ne s'agit que d'un réseau interne.
-Multiplexage
+La parallélisation est possible même avec des dizaines de milliers de connexions avec une connexion TCP, la surcharge telle que la prise de contact à trois peut être réduite et elle n'est pas bloquée
- Protocol Buffers
+Sérialiseur Google
- IDL
+Le taux de compression est plus élevé lors de la conception pour gérer des types numériques plutôt que des chaînes de caractères, en utilisant des balises sans avoir de noms de champ comme données.
-Équilibrage de charge côté client
+Résolveur de nom de client gRPC(DNS)S'étend pour prendre en charge l'augmentation / la diminution du serveur gRPC dynamique (mise à jour de la liste des serveurs par API ou exécution périodique)
+Facile à gérer sans avoir besoin d'un équilibreur de charge externe tel que nginx
###Résultat de l'application effective de gRPC
-référence
+Test de résistance du serveur d'information sur les produits publicitaires seul (débit maximal, mesure de l'évolution du nombre de connexions)
+Mesure de la latence et du débit dans un environnement de test de charge (une série de traitement des offres)
-Il est possible d'appliquer une charge à l'aide de JMeter même avec gRPC
+Il est possible de préparer une classe qui implémente JavaSamplerClient et de demander n'importe quel protocole.
-Test de chargement
- Java8, 128GB, 8Coe/16thread
+100 millions de cas, 1.6TB
+Nous avons pu traiter des dizaines de milliers de dossiers par seconde sans aucun problème ⇒ 3 serveurs d'informations sur les produits publicitaires-4 unités disponibles
+Le nombre de connexions était constant, non proportionnel au débit (le multiplexage permet un traitement avec moins de connexions TCP)
-Malgré l'externalisation du traitement local, environ 10% de changement (0).C'était à moins de 1 ms)
##L'histoire de la création d'une application serveur avec DDD et une architecture propre
-La construction urgente ne fonctionne pas
+Le contour de la spécification a été décidé, certaines des fonctions de base avaient des parties, donc je veux voir ce qui fonctionne en les utilisant dès que possible
+Le prototypage s'est déroulé lors de la création des spécifications fonctionnelles
+J'ai été beaucoup poussé et le prototype était sur le point de devenir un code de production ⇒ je n'ai pas pu le sortir
-Diverses réflexions
+Téléchargez tous les clients du serveur et du processus (volume de trafic anormal, charge de traitement client accrue)
+Le reflet des changements de spécification de la destination de la coopération externe se reflète dans tous les composants
+Aucun composant ne constitue le corps principal de la logique métier et chaque composant ne peut pas se concentrer sur la logique de base et supporte le processus de conversion
###conception
-Ordre de conception
+Définir le pas d'ascenseur
+Définir les spécifications fonctionnelles et les scénarios d'utilisation (définir également les exigences non fonctionnelles)
+Analyse de robustesse
+Extraction du contexte borné
+Créer une carte de contexte
-Analyse de robustesse
+Créer un scénario de cas d'utilisation à l'avance
+Réfléchissez à la façon de créer une fonction qui répond au scénario
+Exprimez-le avec des frontières (écrans, cron), des entités (données à gérer), des contrôles (traitement, authentification des utilisateurs, acquisition de valeur, etc.)
+Manuscrit, écrit et effacé dans le cahier, et adopté celui qui semble bon à analyser par deux personnes
-Carte contextuelle
+Pour les fonctions apparaissant dans le diagramme de robustesse, collectez des fonctions similaires et définissez un «contexte borné»
+Ecrire → réparer → écrire → corriger
+Jugé soigneusement les relations entre les contextes (partenariat, client/Fournisseur, adaptateur)
-Langue omniprésente
+Établissez des termes uniques pour chaque contexte
+En tant que système, il est plus facile de comprendre si les termes sont unifiés entre les contextes, et nous n'utilisons pas les mêmes termes dans des contextes différents avec des significations différentes.
+J'ai aussi décidé de le nommer sur le programme → C'est populaire
###Choses à préparer avant la mise en œuvre
-règle
+Fonctionnement du référentiel Git, norme de codage, configuration du package, norme d'API Rest, niveau de journalisation
+L'exception définit la classe près de l'endroit où elle s'est produite
-Point de vue de l'examen du code source
+Est-il possible pour une autre personne de le maintenir, est-il extensible dans le futur, n'y a-t-il pas de gaspillage, la portée d'influence est-elle trop large?
+Sécurité (réécriture des variables d'instance de la classe Autowired, l'expiration du cache est-elle prise en compte?)
-L'architecture dans chaque contexte
###L'architecture dans chaque contexte
-Couche d'interface
- Controller: Request
- Presenter: Response
- Gateway: Storage,Service externe
+Traducteur pour chacun (traduit les mots de votre domaine en mots de l'extérieur)
-Couche de cas d'utilisation
-Couche de domaine
- Entity, ValueObject, Service, Repository
-Langue publiée: définit les données d'entrée / sortie du contexte, chaque contexte utilise la classe sous pl de l'appelé
-bibliothèque: une bibliothèque qui mérite d'être partagée dans plusieurs contextes sans implication dans la logique métier
-Implémentation du référentiel
+Définir uniquement l'interface dans le domaine et traiter réellement dans la passerelle
+Le référentiel de domaine est table et 1:1 Défini pour ne pas correspondre (définir pour ne pas savoir où il est réellement enregistré)
+La passerelle définit la partie physique
###Ce que j'ai trouvé après sa mise en œuvre
-Vous pouvez vous concentrer sur vos intérêts
- @La plage à laquelle vous devez penser dans Transactional peut être étroite
+Comme les termes sont unifiés, vous pouvez clairement vous connecter des spécifications externes au code
-Facile à suivre car le flux de traitement est structuré
-Tempête de conversion ...
-Bonne chose
+Libre de monolithes, RDB permet à chacun de se concentrer sur la logique métier de sa part/Étendue claire de la responsabilité avec la séparation du cache (DB peut être utilisé comme le mien)
+Défi de la nouvelle technologie: Docker, AWS ECS(Je voulais être Fargate, mais je ne suis pas venu au Japon 200-Abandonné car il y a une latence de 300 ms), GitLab CI
-Il y a place à amélioration
+Règles approfondies