jiangyu/sharding-preemption

一个微分片预抢夺框架。

0.1.1 2015-12-06 13:35 UTC

This package is not auto-updated.

Last update: 2024-09-18 18:47:59 UTC


README

Build Status GitHub license Packagist Version Total Downloads Code Climate Test Coverage

ShardingPreemption

一个微分片预抢夺框架。

假设你有100个分片,并且你有10个工作器来处理所有这些分片,所以每个工作器可以处理10个分片,每个分片只能由1个工作器处理。

通过将所有100个分片分成10个片段,并同时启动10个工作器,每个工作器尝试占用一个片段,最终他们可以接管所有这些分片。

如果工作器不在同一台机器上工作,那么可以引入一些DLM(分布式锁管理器)解决方案来实现这个目标。

$options = getopt('', ['worker:']);

$workerCount = isset($options['worker']) ? (int) $options['worker'] : 2;

$allShardSetting = [
    'db1' => [
        'host' => '127.0.0.1',
        'port' => '3306',
        'username' => 'hello',
        'password' => 'world',
        'database' => 'db1',
    ],
    'db2' => [
        'host' => '127.0.0.1',
        'port' => '3307',
        'username' => 'hello',
        'password' => 'world',
        'database' => 'db2',
    ],
    'db3' => [
        'host' => '127.0.0.1',
        'port' => '3308',
        'username' => 'hello',
        'password' => 'world',
        'database' => 'db3',
    ],
];

$skeleton = new PollMySQLOnSingleMachine($allShardSetting, function (ResourceCollection $slice) {
    $sliceHash = $slice->getHashValue();
    $pid = posix_getpid();
    dump($pid.' acquired ownership on slice['.$sliceHash.'] =>');
    dump($slice->getDigestion());

    dump($pid.' working');
    sleep(5);

    dump($pid.' job done, quit');
});

$skeleton->setWorkerCount($workerCount);
$skeleton->poll();