Schön dich kennenzulernen, mein Name ist Yuya Takeda (@kagamikarasu). Wir entwickeln "SOLD OUT 2 Market Information Site".
Die Sanierung der "Marktinformationsseite" begann um August 2020 und wurde im September ersetzt. Es ist über einen Monat her und hat sich beruhigt, daher möchte ich einen Artikel über die "Marktinformationsseite" schreiben.
Es ist ein "Online-Shop vorgeben" von mu betrieben. https://so2.mutoys.com/
Lernprogramm https://so2-docs.mutoys.com/common/tutorial.html
Sie geben Artikel aus, um neue Artikel zu erhalten, und verwenden sie, um neue Produkte zu erstellen und zu verkaufen. Verkauf an NPCs, Verkauf an Benutzer, Teilnahme an Veranstaltungen und Spielstile sind für jede Person unterschiedlich.
Dies ist eine von mir entwickelte Marktinformationsseite (@kagamikarasu). https://market.kagamikarasu.net/
Da die API von mu für die Öffentlichkeit zugänglich ist, habe ich sie damit entwickelt. Sie können den Preis- / Bestandsübergang für jedes Produkt und die Anzahl der Bestandsreduzierungen für jedes Geschäft im Diagramm- / Tabellenformat erfassen.
Der Endbenutzer kann lediglich eine Referenz erstellen.
Ich lief auf meinem Heimserver + Conoha (LB-Rolle) + Java 1.8 + MySQL (später MariaDB). Es wurde schwierig zu entwickeln, also habe ich es neu entwickelt.
Java ist chaotisch, das Abrufen und Bereitstellen von Zertifikaten ist mühsam. Ich wollte meinen Heimserver (kein PC / USV) wegen der aufgeblähten Datenbank beenden ...
Es waren über eine Milliarde Datensätze auf einem großen Tisch. Zuerst habe ich an nichts gedacht, also habe ich nicht an die Datenmenge gedacht.
Ich hatte das Gefühl, dass es offensichtlich langsam war, also überprüfte ich den Index und die Suchbedingungen, aber Ich befand mich in einem Zustand des Wassers auf dem verbrannten Stein, also löste ich ihn, indem ich den Speicher änderte und IOPS verdiente.
Festplatte → SSD → SSD (NVME) in 3 Jahren. NVME ist sehr schnell, bis dahin, wenn Sie süß sagen Haben Sie bei der Eingabe des Befehls einen Fehler gemacht, weil die Migration beim Ändern des Speichers zu schnell war? Ich bezweifle das.
Ich habe gerade SAA studiert und mich für AWS entschieden. Das größte Problem ist, die vierte monatliche Gebühr niedrig zu halten.
Wenn es sich um RDS + EC2 + ALB handelt, ohne an irgendetwas zu denken, denke ich, dass RDS je nach Konfiguration ein angemessener Geldbetrag sein wird. Es ist nichts für ein Unternehmen, aber es ist sehr schmerzhaft für eine Person (zumindest für mich) ('A')
* Bitte befolgen Sie die Dosierung für die unten aufgeführten Artikel. </ font>
DynamoDB Die Migration auf RDS (MariaDB) ist am einfachsten. Wenn Sie jedoch Hunderte von GB Daten migrieren und betreiben, werden die Betriebskosten reduziert. Ich habe geschrieben, dass es auf mehrere hundert GB migrieren wird, aber alle Migrationsdaten werden im HIVE-Format + JSON-Format an S3 übertragen. Führen Sie gegebenenfalls S3 → Lambda → SQS → DyanamoDB aus, was später beschrieben wird.
Die kostenlose Stufe von DynamoDB beträgt zum Zeitpunkt des Schreibens des Artikels 25 GB und 25 On-Demand-WCU / RCU.
Daher ist es wünschenswert, die Daten pro Datensatz innerhalb von 1 KB zu halten. Dieses Mal wird nur eine Tabelle verwendet und 5WCU / RCU zugewiesen. Da die Marktinformationsseite jedes Element extrahiert, lautet der Partitionsschlüssel natürlich item_id. Da ich es in chronologischer Reihenfolge haben möchte, ist der Sortierschlüssel die UNIX-Zeit des Registrierungsdatums und der Registrierungszeit.
In der Datenbank vor der Migration (MariaDB) hatten wir Daten in Speichereinheiten (vor der Aggregation) in Intervallen von 10 Minuten. Die migrierte Datenbank (DyanmoDB) enthält Daten in Artikeleinheiten (aggregiert) in Intervallen von 3 Stunden.
Da auch SQS verwendet wird, wird die spezifische Aggregations- / Speichermethode später beschrieben, der WCU-Verbrauch entspricht jedoch der in der folgenden Abbildung gezeigten. Sie können die Datenbank weiterhin kostenlos nutzen, solange die Kapazität innerhalb von 25 GB liegt.
SQS Als nächstes kommt SQS. Ich hatte noch nie von Warteschlangen gewusst, aber als ich SAA studierte, stellte ich fest, dass es sehr gut war und entschied mich, es in Kombination mit DynamoDB zu verwenden.
Die kostenlose Stufe für SQS beträgt 1 Million Anfragen. Ich habe es zuerst nicht verstanden, aber ich werde 2 Anfragen zum Senden und Empfangen verwenden. Derzeit schätzen wir auf 2000 Artikel, daher setzen wir diese in 3-Stunden-Einheiten, um sie auf 1 Million Anfragen zu begrenzen. 2000 * 8 * 30 * 2 = 960.000 Da es sich um SQS handelt, ist es in Ordnung, wenn Sie ein wenig herauskommen, aber ich möchte es so frei wie möglich halten, also alle 3 Stunden.
Wie oben erwähnt, werden aggregierte Daten alle 3 Stunden in DynamoDB gespeichert. Es wird in Artikeleinheiten gespeichert, aber derzeit war es notwendig, etwa 2000 Artikel alle 3 Stunden zu speichern. Wenn Sie 2000 Artikel in 1 Sekunde speichern, benötigen Sie 2000WCU als 1 KB pro Artikel. Da es für mehr als 1000 US-Dollar pro Monat bankrott gehen wird, werde ich dieses Mal SQS und DynamoDB kombinieren, um das Schreib-Timing zu verschieben.
Insbesondere ist es Lambda (Aggregation) → SQS → Lambda (SQS-Extraktion / DynamoDB-Speicher) → DynamoDB. Es muss kein FIFO sein, daher wird eine Standardwarteschlange verwendet.
Zuerst dachte ich, dass der Lambda-Trigger von SQS praktisch ist, aber es gab einen Verbrauch, von dem ich nicht erwartet hatte, dass er überwacht wird, und als ich ihn untersuchte, trat Folgendes auf. Referenz: https://encr.jp/blog/posts/20200326_morning/
Es ist eine kleine Sache, aber ich fühlte mich ein wenig unwohl, deshalb habe ich beschlossen, sie mit CloudWatch Event und Lambda anstelle von Lambda-Trigger selbst aus SQS zu holen.
Die Anzahl der empfangenen SQS ist wie folgt. In CloudWatch Event wird die Warteschlange in Einheiten von 1 Minute angezeigt, und Lambda legt ein Limit für die Warteschlangenerfassung fest, um eine Kapazitätsüberlastung so weit wie möglich zu verhindern.
Lambda CloudWatch Event + Lambda ist für die gesamte Erfassung und Aggregation verantwortlich.
Lambda ist die Anzahl der Anforderungen und die Ausführungszeit. Die kostenlose Stufe umfasst 1 Million Anfragen und 400.000 GB Sekunden. Zumindest hat meine Nutzung die kostenlose Stufe nicht überschritten. (Etwas mehr als 10% des freien Rahmens)
Zum Zeitpunkt des Schreibens werden die folgenden Funktionen erstellt.
Da ich Python + Pandas verwende, ist die Aggregation sehr einfach. Zuerst dachte ich, ich könnte es forcieren, aber es wurde im Gedächtnis sehr schmerzhaft, also benutzte ich Pandas.
Da das Serverless Framework verwendet wird, ist die Bereitstellung einfacher. Ich denke, dass das, was ich tue, dasselbe ist wie CloudFormation, daher beschreibe ich auch API Gateway.
Wenn Sie den Test und die Bereitstellung wiederholen, steigt der Abfall wahrscheinlich aufgrund der Versionsverwaltung. Ich denke, Sie sollten "Serverless-Prune-Plugin" verwenden, um es automatisch zu löschen.
Der Nutzungsbetrag für Lambda ist wie folgt. Die zugewiesene Speichermenge hängt von der Funktion ab, ist jedoch auf 128 MB bis 512 MB eingestellt.
CloudWatchEvent Wird für die Stapelverarbeitung verwendet (reguläre Verarbeitung). Ich denke, es gibt verschiedene Dinge wie EC2 + cron und digdag, aber da Lambda verwendet werden kann, werde ich es mit CloudWatch Event kombinieren.
Als ich dachte, dass die Charge zu einem bestimmten Zeitpunkt nicht funktionierte, war es GMT ... Da die Sprache auf Japanisch eingestellt ist, war ich vorsichtig mit JST ...
ECS(EC2) In Bezug auf ECS ist dies sehr mächtig. Es ist eine Kombination aus ECR + ECS + ALB + Route53.
Ich benutze EC2 anstelle von Fargate. (Weil es billig ist ...) Mit ECS und ALB können Sie mehrere Aufgaben-> Docker-Container in einer EC2-Instanz ausführen.
Auf diese Weise können Sie die Bereitstellung ohne Aktualisierung oder Hinzufügen neuer Instanzen durchführen. (Es sei denn, es ist das Speicherlimit der Instanz) Die Existenz der EC2-Instanz selbst wird dünn, und da sie vom Docker ausgeführt wird, wird keine Verbindung über SSH selbst hergestellt.
EC2 verwendet auch Spot-Instanzen. Dies hat je nach Instanztyp zu einer Reduzierung der Gebühren um 70% im Vergleich zu On-Demand-Instanzen geführt.
Anstelle eines großen Rabattes ist es ein Ersatz, der jederzeit von AWS unterbrochen werden kann. Wenn dies fehlschlägt, füllt Spot Fleet die erforderlichen Instanzen automatisch auf und der ECS-Dienst füllt die erforderlichen Aufgaben auf. Gleichzeitig funktioniert der Gesundheitscheck von ALB, abnormale Dinge werden vom Ziel entfernt und normale Dinge werden ins Visier genommen.
Da ich diesmal die t3.micro-Instanz verwendet habe, kostet sie ungefähr 1 Yen pro Stunde, und wenn sie 1 Monat lang von 2 Einheiten betrieben wird, sind es ungefähr 1440 Yen. Da wir Spot-Instanzen verwenden, sind es diesmal 432 Yen mit einem Rabatt von 70%, je nach Fall.
ALB Wie bereits erwähnt, wird es für die Kombination mit ECS verwendet, es ist jedoch möglich, Zertifikate von ACM zu verwenden. Es ist viel einfacher als Let's Encrypt, weil es nur ein Knopfdruck ist.
Abhängig von der Anzahl der Zugriffe wird es jedoch wahrscheinlich etwa 2000 Yen kosten. Der persönliche Gebrauch ist etwas teuer, wenn Sie ihn nur mit einem einzigen Dienst verwenden. Da jedoch Host-basiertes Ruding möglich ist, Wenn Sie mehrere Dienste ausführen, ist dies meiner Meinung nach keine hohe Investition in Bezug auf ECS, ACM, Routing und Verwaltung.
Außerdem werden Sticky-Sitzungen deaktiviert, da Redis die Sitzungen verwaltet. Dies liegt daran, dass, wenn EC2 beim Einschalten plötzlich abfällt, auf das heruntergefallene EC2 zugegriffen wird.
Route 53 Es wird um die Domain sein. Übrigens haben wir in Bezug auf die Domain letztes Jahr von "Name.com" auf "Route 53" gewechselt. Grundsätzlich kostet es ungefähr 50 Yen pro Monat.
Abgesehen davon gibt es eine Funktion namens ECS Service Discovery. Es ist schwierig, eine Kommunikation zwischen Containern mit ECS zu realisieren. (Obwohl verschiedene Container auf demselben Server verbunden werden können, verschiedene Server, Netzwerkmodus usw.)
Bei der Diensterkennung können bei ECS registrierte Dienste automatisch in der internen Hostzone registriert / aktualisiert werden. Wenn der Netzwerkmodus awsvpc ist, kann ein Datensatz registriert werden.
Da eine neue Hostzone erstellt wird, kostet dies etwa 50 Yen erneut. Es ist jedoch sehr hilfreich, den Dienst und die interne Domäne automatisch zu verknüpfen. Selbst wenn der Dienst (die Aufgabe) ausfällt, kehrt ECS automatisch zurück und verknüpft ihn.
In dieser Umgebung ist Redis (nicht ElastiCache) in ECS eingerichtet Es dient zur Kommunikation mit der Anwendungsseite (separater Container). Es wäre schön, ElastiCache verwenden zu können, aber es kostet Geld ...
S3 In S3 werden Ihnen der Speicherbetrag und GET / PUT in Rechnung gestellt. In diesem System werden Stammdaten und Vor- / Nachdaten in S3 gespeichert. Da PUT nur auf der Systemseite ausgeführt werden kann, versuche ich, es nicht so weit wie möglich zu generieren. Da GET jedoch vom Timing des Benutzers abhängt, zwischenspeichern Sie es in EC2 mit Redis, damit GET nicht so häufig wie möglich auftritt. Ich bin.
Kommunikation kostet auch Geld, es ist eine kleine Sache, aber ich denke, je mehr Sie Dienste kombinieren, desto größer sind die Auswirkungen. Insbesondere in ALB fallen für neue Verbindungen Gebühren an, sodass ich keine Kommunikation verschwenden möchte. Es ist schön, dass robots.txt damit umgehen kann, aber ich denke, es ist auch eine gute Idee, die eingehende Verbindung mit ACL zu trennen.
Ich habe mich gefragt, ob es instabil sein würde, weil ich eine Spot-Instanz verwendet habe, aber ich war überrascht, dass es keine Beweise dafür gab, dass sie gefallen war. Ich habe nach dem Austausch einige Wochen lang neue Funktionen entwickelt, aber die Entwicklung ist viel einfacher als in der vorherigen Umgebung.
Zumal es mit Docker entwickelt wurde, ist es zum Zeitpunkt der Erstellung etwas schwierig, aber danach erstellen und aktualisieren Sie einfach die Aufgabe. Pandas auf der Lambda-Seite sind ebenfalls sehr einfach zu handhaben, und sobald der Mechanismus eingerichtet ist, habe ich das Gefühl, dass ich alles tun kann. → Grundsätzlich werden Daten von Lambda generiert, von Laravel in Redis gespeichert und das Ergebnis an den Benutzer zurückgegeben.
Der Nutzungsbetrag der kostenlosen Stufe war vor Monatsende wie folgt.
Es ist über ein Jahr her, seit ich mein Konto erstellt habe, also dachte ich, ich hätte keine einjährige kostenlose Stufe. Es war eine kostenlose Stufe und es wurde keine Abrechnung vorgenommen. Ist es ein Jahr ab der ersten Abrechnung, anstatt ein Konto zu erstellen?
Dieses Mal habe ich das Gefühl, den Übergang geschafft zu haben. Da alle früheren Daten in S3 gespeichert sind, können sie bei Bedarf in DynamoDB wiedergegeben werden. (Ich habe das Gefühl, dass frühere Daten nicht viel benötigt werden ....)
Da ich nur Konstruktionsarbeiten durchgeführt habe, sind die Betriebsarbeiten spärlich. Der Bereitstellungsprozess ist beispielsweise manuell. Ich möchte CircleCI und CodeDeploy nacheinander kombinieren, aber ich frage mich, ob ich in Schwierigkeiten bin, wenn ich mich selbst entwickle.
Außerdem ist die Überwachungsumgebung ebenfalls spärlich. Wir überwachen die äußere Form nicht und richten SNS nicht ein. Ich habe kürzlich bemerkt, dass ich robots.txt und ACL festgelegt habe, weil Bots viel zugreifen und LCU nüchtern verbrauchen. Da das Protokoll in CloudWatch ausgegeben wird, möchte ich eine Umgebung erstellen, in der es einfach analysiert werden kann.
Da es sich um numerische Daten handelt, halte ich es für interessant, maschinelles Lernen auszuprobieren. Eigentlich habe ich es ein wenig berührt (multiple Regression), aber ich habe auf meinem PC mit vielen Parametern geschrien ('A') Lambda ist sehr hart, daher frage ich mich, ob es sich anfühlt, eine Instanz einzurichten und zu analysieren.
Der Inhalt jedes einzelnen ist dünn geworden, aber wenn ich die Gelegenheit dazu habe, möchte ich mich damit befassen und einen Artikel schreiben. Danke, dass Sie so weit gelesen haben!
Recommended Posts