Heim  >  Artikel  >  Backend-Entwicklung  >  PHP-Ideen und -Methoden zur Lösung von blockierenden Lagerbeständen mit hoher Parallelität, zur Verhinderung und Kontrolle von Überbeständen, Blitzverkäufen, Eigentumsraub, Lotterien usw.

PHP-Ideen und -Methoden zur Lösung von blockierenden Lagerbeständen mit hoher Parallelität, zur Verhinderung und Kontrolle von Überbeständen, Blitzverkäufen, Eigentumsraub, Lotterien usw.

WBOY
WBOYOriginal
2016-07-29 09:13:581350Durchsuche
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üsselproduct_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);
?>
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.


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn