最近、銀行照合のインターフェイスをするときに、正確な要件の一般的な説明で穴を踏みました。
銀行は毎日午前0時を過ぎると、昨日の取引フローデータを準備し始めます。
Base64で暗号化されたZIP圧縮ストリームが提供され、それを解凍すると必要なデータを含むtxtファイルが得られるからです。
ビジネスプロセスを書き上げた後、時間指定のタスクを放り込んで寝ました。
翌日、仕事に行くとき、チェックすることを知っています。システムエラーメッセージ:データを取得していないことが判明し、ログをチェックすると、早朝のサーバー側の要求は、銀行のインターフェイスが返されたことがわかりました。
銀行側に相談したところ、銀行側の担当者はもっと回数をリクエストするよう提案してくれましたが、何度もリクエストしているうちに、銀行側には回数制限があることがわかり、最終的にこのインターフェースは30分に1回しかリクエストできないことがわかりました。これでは、銀行側がいつデータを返してくれるのかわかりません。
では、この問題はどのように解決されるのでしょうか?理想的なのは、サーバーがデータを要求し、銀行側がそれを返さない場合です。その後、プログラムは30分待ち、再びデータを要求し、銀行側が正しいデータを返すまでそれを繰り返します。
この機能は、他の言語に変更することは難しくないかもしれませんが、phpの実装を通して、より面倒です。通常、linuxのcronで実装できます。例えば、6:00amから6:00amの間に時間指定タスクを実行し、30分ごとにphpスクリプトをスキャンし、銀行側のステータスがまだ失敗していることがわかったら、phpスクリプトを実行してデータを要求します。正しいデータがリクエストされるまで、ステータスを成功に更新します。
悪いやり方ではありませんが、愚かなやり方です。銀行側ではもっと普通で、早朝、つまり最初のリクエストで正しいデータが返されるとすると、cronスクリプトはやはり30分ごとに実行されることになり、バカバカしい!~
あるいは、Linuxでatコマンドを使ってみることもできますが、それでもエレガントさに欠けます。
そこで、この問題を解決するためにswooleプラグインのlaravelエクステンションを提供することにしました。
まず第一に、あなたはswoole拡張機能をインストールする必要があり、具体的なプロセスは少し。
インストール後、swooleの簡単なサーバー側のテストスクリプトを記述します。このスクリプトは、app/Console/Commands/Commands/作者の下のapp/Console/Commands/Swoole/swoole.phpの特定のコードの下に次のように配置されていることに注意してください。
<?php
namespace App\Console\Commands\Swoole;
use Illuminate\Console\Command;
class swoole extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'swoole {action}';
/**
* The console command description.
*
* @var string
*/
protected $description = "Let's use swoole !";
private $serv;
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$arg = $this->argument('action');
switch ($arg) {
case 'start':
$this->info('swoole server started');
$this->start();
break;
case 'stop':
$this->info('stoped');
$this->stop();
break;
case 'restart':
$this->info('restarted');
break;
}
}
private function start()
{
$this->serv = new \swoole_server(".1", 9501);
$this->serv->set(array(
'worker_num' => 8,
'daemonize' => false,
'max_request' => 10000,
'dispatch_mode' => 2,
'task_worker_num' => 8,
'task_ipc_mode' => 3,
'log_file' => storage_path('logs/taskqueue.log'),
));
$this->serv->on('Receive', array($this, 'onReceive'));
$this->serv->on('Task', array($this, 'onTask'));
$this->serv->on('Finish', array($this, 'onFinish'));
$this->serv->start();
}
public function onReceive(\swoole_server $serv, $fd, $from_id, $data)
{
$serv->task($data);
}
public function onTask($serv, $task_id, $from_id, $data)
{
$timeon = (3) * 1000;
if ($timeon > 0) {
$serv->after($timeon, function () {
//ビジネスロジックサービス
exec('php /path/to/root/artisan Test:Command');
});
}
return date('Y-m-d H:i:s') . "最初の";
}
public function onFinish($serv, $task_id, $data)
{
echo "Task finish
";
}
private function stop()
{
exec('/usr/bin/killall php');
}
}
これはサーバー側で、主にアフターメソッドを使って、シミュレーションすると、3秒の実行です。実際には30分かかります。
次に、ランダムなクライアント接続クラスを書きます。
<?php
/**
* Created by PhpStorm.
* User: nosay
* Date: 4/13/18
* Time: 9:27 PM
*/
namespace App\Extension\php\Swoole;
class swoole{
private $data;
private $client;
public function __construct($data){
$this->data = $data;
$this->client = new \swoole_client(SWOOLE_SOCK_TCP);
}
public function connect(){
if( !$this->client->connect(".1", 9501 , 1) ) {
echo "Error";
}
$this->client->send($this->data);
}
}
銀行スクリプトでは、次のように実行します。
<?php
namespace App\Console\Commands\Test;
use App\Extension\php\Swoole\swoole;
use Illuminate\Console\Command;
class TestCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'Test:Command';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Command Test';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
//以下はビジネスロジックである。
//銀行がfalseを返したら、それをswooleタイミングスクリプトに渡す
$status = false;
if(!$status)
{
$swoole = new swoole("hehe");
$swoole->connect();
}
}
}
高度な多くのPHPerは、常にいくつかの問題やボトルネックに遭遇し、ビジネスコードは、方向感覚よりも多くを記述するために、私はいくつかの情報を照合している改善するためにどこから始めればわからないが、これらに限定されない:分散アーキテクチャ、高いスケーラビリティ、高性能、高同時性、サーバーのパフォーマンスチューニング、TP6、laravel、YII2、Redis、Swoole、Swoft、Kafka、Mysqlの最適化、シェルスクリプト、Docker、マイクロサービス、Nginx、その他多くの高度な高度な乾物は、みんなと自由に共有する必要があります!





