요즘 전자상거래 업계에서는 깜짝 세일급매 활동이 가맹점의 일반적인 판촉 수단으로 자리 잡았습니다. 하지만 재고수량이 한정되어 있어 동시에 주문하는 인원이 재고수를 초과할 경우 해당 상품이 과매도되거나 심지어 재고가 마이너스가 되는 원인이 됩니다. 또 다른 예: 서둘러 기차표를 구매하고, 포럼에서 서둘러 부동산을 구매하고, 복권, 심지어 인기 있는 Weibo 댓글도 높은 동시성 문제를 차단할 수 있습니다. 아무런 조치도 취하지 않으면 서버가 순간적으로 마비될 수 있습니다. 어떻게 해결해야 할까요?
다음은 제가 생각하기에 더 실현 가능하다고 생각하는 몇 가지 아이디어입니다.
옵션 1: 메시지
대기열 을 사용하여 MemcacheQ와 같은 메시지
Queue
를 기반으로 할 수 있으며 구체적인 구현 계획은 다음과 같습니다예를 들어 100장의 티켓이 있습니다. 그러면 이 100개의 티켓을 캐시에 넣을 수 있고 읽고 쓸 때 잠그지 않을 수 있습니다. 동시성이 큰 경우 약 500명 정도가 티켓을 성공적으로 획득할 수 있기 때문에 500명 이후의 요청은 이벤트 종료 시 정적 페이지로 직접 전송될 수 있습니다. 입장하시는 500명 중 400명은 상품을 받으실 수 없습니다. 따라서
큐
에 입장하신 순서에 따라 선착순 100명만 구매에 성공하실 수 있습니다. 다음 400명은 이벤트 종료 페이지로 바로 이동됩니다. 물론 500명을 입력하는 것은 예시일 뿐이며, 숫자를 직접 조정할 수도 있습니다. 활동 종료 페이지는 데이터베이스가 아닌 정적 페이지를 사용해야 합니다. 이렇게 하면 데이터베이스에 대한 부담이 줄어듭니다. 옵션 2: 서버가 여러 개인 경우 오프로딩 형태로 구현 가능
m개의 티켓과 n개의 상품이 있다고 가정 서버가 요청을 받고 >카운터
가 있습니다. 예를 들어 m/n*(1+0.1)명의 사람들이 들어올 수 있도록 허용합니다.
메모리
카운터가 가득 찼을 때:
나중에 입장한 분들은 이벤트가 끝나는 정적 페이지로 바로 이동합니다. 더 이상 이 서버로 라우팅되지 않을 것임을 라우팅 서버에 알립니다(논의할 가치가 있음).
모든 상품 서버에서 들어오는 m/n*(1+0.1) 개인은 결제 서버로 전달되어 누가 더 빠른지 확인하는 결제 프로세스에 들어갑니다. 이번에는 잠그십시오. 간단한 것입니다. 옵션 3. 단일 서버인 경우 Memcache 잠금을 사용하여 구현할 수 있습니다.
product_key가 티켓 키입니다
product_lock_key는 티켓 잠금 키입니다
memcached에 product_key가 존재하면 모든 사용자가 주문 프로세스에 들어갈 수 있습니다.
결제 진입 시 먼저 memcached에 add(product_lock_key, “1″)를 저장하고, 반품에 성공하면 결제 진입합니다. 실패하면 누군가 이미 결제 프로세스에 진입했다는 의미이며 스레드는 N초를 기다린 후 재귀적으로 추가 작업을 수행합니다. 옵션 4, 파일 단독 잠금 사용
주문 요청 처리 시 Flock을 사용하여 잠금에 실패하면 파일을 잠급니다. 다른 주문이 처리 중이라는 의미입니다. 이때 기다리거나 사용자에게 "서버가 사용 중입니다"라는 메시지를 직접 표시합니다
이 기사에서는 네 번째 옵션에 대해 설명합니다. 다음과 같습니다
차단(대기) 모드:
비차단 모드:
<?php
$fp = fopen("lock.txt", "w+");
if(flock($fp,LOCK_EX))
{
//..处理订单
flock($fp,LOCK_UN);
}
fclose($fp);
?>
로그인 후 복사
위 내용은 대기열, 반짝 세일, 인원수, 카운터를 포함하여 패닉 구매, 플래시 세일, 부동산 강탈, 복권 등과 같은 동시성 높은 재고 예방 및 제어를 차단하는 문제를 해결하기 위한 PHP의 아이디어와 방법을 소개합니다. PHP 튜토리얼에 관심이 있는 친구들이 도움이 되기를 바랍니다.