트래픽 비율 기반 세트 픽은?
-
06-09-2019 - |
문제
설정 : 높은 트래픽 웹 사이트 및 표시하려는 이미지 URL 목록. 이미지 지점이 하나 있고 이미지 URL 세트의 각 항목에는 오늘의 대상 표시 비율이 있습니다. 예시:
- 이미지 1-10%
- image2-30%
- image3-60%
트래픽 금액은 매일 다를 수 있기 때문에 1000 블록 내에서 백분율을 수행하고 있습니다. 이미지도 무작위로 선택해야하지만 여전히 분포에 정확하게 맞습니다.
질문 : Memcache 에서이 작업을 수행하기위한 POC 코드를 구현했지만 데이터가 저장되는 방식이 불편합니다 (메타 데이터와 함께 "마스터 레코드"에 의해 맵핑 된 다중 해시 키). Memcache 서버가 다운되면 데이터베이스로 돌아갈 수 있어야합니다. 또한 마스터 레코드의 동시성 문제에 대해 걱정하고 있습니다.
이것을 달성하는 더 간단한 방법이 있습니까? 아마도 빠른 MySQL 쿼리 또는 이것에 memcache를 가져 오는 더 좋은 방법일까요?
감사
올바른 솔루션이 없습니다
다른 팁
당신은 당신이 말한 것을 할 수 있고, 당신이 반환 할 이미지를 가리키는 1000 값의 블록을 미리 유도 할 수 있습니다.
$distribution = "011022201111202102100120 ..." # exactly evenly distributed
그런 다음 해당 블록을 MySQL 및 Memcache에 저장하고 다른 키 (MySQL 및 Memcache 모두)를 사용하여 위의 문자열의 현재 색인 값을 유지하십시오. 이미지 스크립트가 닿을 때마다 Memcache의 값이 증가합니다. Memcache가 다운되면 대신 MySQL로 이동하십시오 (업데이트하고 선택하십시오.이 부분을 수행하는 더 좋은 방법이있을 수 있습니다).
Memcache와 MySQL을 동기화하려면 CRON 작업이 Memcache에서 MySQL로 현재 색인 값을 복사 할 수 있습니다. 약간의 정확성을 잃을 수 있지만이 상황에서는 중요하지 않을 수 있습니다.
MySQL과 Memcache에 여러 분포를 저장하고 현재 활성 분포를 가리키는 또 다른 키가있을 수 있습니다. 이렇게하면 미래의 이미지 블록을 선사시킬 수 있습니다. 인덱스가 분포를 초과하면 스크립트가 키를 증가시키고 다음 스크립트로 이동합니다.
대충:
function FetchImageFname( )
{
$images = array( 0 => 'image1.jpg', 1 => 'image2.jpg', 2 => 'image3.jpg' );
$distribution = FetchDistribution( );
$currentindex = FetchCurrentIndex( );
$x = 0;
while( $distribution[$currentindex] == '' && $x < 10 );
{
IncrementCurrentDistribKey( );
$distribution = FetchDistribution( );
$currentindex = FetchCurrentIndex( );
$x++;
}
if( $distribution[$currentindex] == '' )
{
// XXX Tried and failed. Send error to central logs.
return( $images[0] );
}
return( $distribution[$currentindex] );
}
function FetchDistribution( )
{
$current_distib_key = FetchCurrentDistribKey( );
$distribution = FetchFromMemcache( $current_distrib_key );
if( !$distribution )
$distribution = FetchFromMySQL( $current_distrib_key );
return $distribution;
}
function FetchCurrentIndex( )
{
$current_index = MemcacheIncrement( 'foo' );
if( $current_index === false )
$current_index = MySQLIncrement( 'foo' );
return $current_index;
}
.. Memcache 서버가 다시 백업되면 MySQL에서 Memcache로 데이터를 복사 할 수 있으며 즉시 재 활성화됩니다.
데이터베이스에 대한 인기는 더 오래 걸릴 가능성이 높으므로 memcache를 고수 할 것입니다. Memcache보다 MySQL을 사용하여 동시성에 더 많은 문제가 생길 것입니다. Memcache는 많은 요청을 처리 할 수있는 장비가 더 잘 갖추어져 있으며 서버가 다운되면 높은 트래픽 웹 사이트에서 걱정이 가장 적습니다.
어쩌면 MySQL 전문가가 더 많은 구체적인 내용을 제공하면 좋은 쿼리 구조로 여기에 파이프 할 수 있습니다.