Heutzutage sind in der E-Commerce-Branche Flash-Sales-Eilkaufaktivitäten zu einer gängigen Werbemethode für Händler geworden. Allerdings ist die Lagerbestandsmenge begrenzt, und wenn die Anzahl der Personen, die gleichzeitig Bestellungen aufgeben, den Lagerbestand übersteigt, führt dies zu überverkauften Produkten oder sogar zu einem negativen Lagerbestand. Ein weiteres Beispiel: Eile beim Kauf von Bahntickets, Eile beim Kauf von Immobilien in Foren, Lotterie und sogar beliebte Weibo-Kommentare können ebenfalls zu Blockierungsproblemen mit hoher Parallelität führen. Wenn keine Maßnahmen ergriffen werden, kann der Server sofort lahmgelegt werden. Wie kann dieses Problem gelöst werden?
Hier sind einige Ideen, die meiner Meinung nach praktikabler sind:
Option 1: Verwenden Sie die Nachrichten-
-Warteschlange , um Es kann auf einer Nachricht
Warteschlange
wie MemcacheQ basieren. Der spezifische Implementierungsplan wird wie folgt beschrieben Zum Beispiel gibt es 100 Tickets für Benutzer zum Greifen, dann können Sie diese 100 Tickets in den Cache legen und sie beim Lesen und Schreiben nicht sperren. Wenn die Parallelität groß ist, können etwa 500 Personen erfolgreich Tickets erhalten, sodass Anfragen nach 500 am Ende der Veranstaltung direkt auf die statische Seite übertragen werden können. Es ist unmöglich, dass 400 der 500 Menschen, die eintreten, das Produkt bekommen. Daher können nur die ersten 100 Personen erfolgreich kaufen, entsprechend der Reihenfolge, in der sie in die
Warteschlange
gelangen. Die nächsten 400 Personen gelangen direkt zur Endseite der Veranstaltung. Die Eingabe von 500 Personen ist natürlich nur ein Beispiel. Sie können die Zahl selbst anpassen. Die Aktivitätsendseite muss eine statische Seite und keine Datenbank verwenden. Dadurch wird der Druck auf die Datenbank verringert. Option 2: Wenn mehrere Server vorhanden sind, kann dies in Form von Offloading implementiert werden
Angenommen, es gibt m Tickets und n Produkte Der Server empfängt die Anfrage und es gibt >Counter
, die beispielsweise m/n*(1+0,1) Personen den Zutritt ermöglichen.
Wenn der Speicher
Zähler voll ist:
Personen, die später eintreten, springen direkt zur statischen Seite, auf der das Ereignis endet, Benachrichtigen Sie den Routing-Server, dass er nicht mehr an diesen Server weitergeleitet wird (dies ist eine Diskussion wert).
Die m/n*(1+0,1) Personen, die von allen Produktservern eingehen, werden dann an einen Zahlungsserver weitergeleitet und treten in den Zahlungsvorgang ein, um zu sehen, wer schneller ist Dieses Mal also etwas Einfaches. Option 3. Wenn es sich um einen einzelnen Server handelt, können Sie die Memcache-Sperre verwenden, um
product_key ist der Ticketschlüssel
product_lock_key ist der Ticket-Sperrschlüssel
Wenn product_key im Memcached vorhanden ist, können alle Benutzer den Bestellvorgang starten. Wenn Sie den Zahlungsvorgang starten, speichern Sie zunächst add(product_lock_key, „1″) im Memcached,
Wenn die Rückgabe erfolgreich ist, starten Sie den Zahlungsvorgang.
Wenn dies fehlschlägt, bedeutet dies, dass bereits jemand in den Zahlungsvorgang eingetreten ist und der Thread N Sekunden wartet und den Add-Vorgang rekursiv ausführt.
Option 4: Datei-Exklusivsperre verwenden Wenn Sie eine Bestellanfrage verarbeiten, verwenden Sie flock, um eine Datei zu sperren bedeutet, dass andere Bestellungen verarbeitet werden. Zu diesem Zeitpunkt müssen Sie entweder warten oder dem Benutzer direkt mitteilen, dass „Server ausgelastet“ ist.
In diesem Artikel geht es um die vierte Option Der Code lautet wie folgt:
Blockierungsmodus (Wartemodus):
Nicht blockierender Modus :
<?php
$fp = fopen("lock.txt", "w+");
if(flock($fp,LOCK_EX))
{
//..处理订单
flock($fp,LOCK_UN);
}
fclose($fp);
?>
Nach dem Login kopieren
Das Obige stellt die Ideen und Methoden von PHP vor, um das Blockieren von Lagerbeständen mit hoher Parallelität zu verhindern und Überläufe wie Eilkäufe, Flash-Verkäufe, Immobilienraub und Lotterieziehungen zu kontrollieren, einschließlich Inhalten zu Warteschlangen, Flash-Verkäufen, Anzahl der Personen und Schaltern, wie ich hoffe dass Freunde, die sich für PHP-Tutorials interessieren, geholfen haben werden.