2

私のaiohttpサーバーの展開オプションで完全に失われました。本番環境でサービスを移動するには複数の方法があり、正しい方法を選択できません。

  1. systemd script/supervisord + api hour 短所: api hour の仕組みがわかりません。サーバーのデーモン コルーチンを制御しているように見えますが、私のサーバーの coro は asyncio.gather 関数で実行されます (低レベルの aiohttp サーバー/接続ハンドラー)。他のコロ (スーパーバイザー/ステートキーパーのクラス永久実行メソッド) と、API 時間で 2 番目のコルーチンを処理するのに問題がある可能性があります
  2. ガンコーン同じだけど1のように
  3. nginx + unix ソケット +systemd スクリプト 短所: デプロイとサポートが非常に難しいように見えます。
  4. systemd スクリプトの下の純粋な aiohttp サーバー: 短所: pid ファイルの処理、低パフォーマンス (?)

私の実行機能は次のようになります。

def run():
    startTime = time.time()
    logging.basicConfig(level=logging.INFO, format="%(asctime)s [ %(levelname)s ]: %(message)s")
    cfg = ConfigStore("server_config.cfg")
    loop = asyncio.get_event_loop()
    logging.info("Starting server")
    db = DBProxyLayer.fabric(cfg("dbCredentials"))
    logging.info("DBLayer initialized {}".format(db))
    try:
        supervisor = QPSServerSupervisor(loop=loop, db=db, config=cfg)
        srvCoro = loop.create_server(lambda: QPSServer(
                    supervisor=supervisor, debug=False, keep_alive_on=False, loop=loop),
                    host=cfg("command_host"), port=cfg("command_port"))
        loop.run_until_complete(asyncio.gather(*(srvCoro, supervisor.startToServe())))
    except Exception as e:
        logging.critical("Server start failure {}\n{}".format(e, traceback.print_exc()))
        sys.exit(-1)
    else:
        logging.info("Server started for {0:.2f} seconds".format(time.time()-startTime))
    try:
        loop.run_forever()
    except Exception as e:
        logging.info(e)
        loop.close()
        sys.exit(-1)
4

1 に答える 1

0

loop.create_serversock=既存のソケットでアクティブ化するキーワードを取ることができます。私のアプローチは

try:
    import systemd.daemon
except ImportError:
    def listeners(hosts, port):
        for host in hosts:
            _log.info("Starting server at %s on port %d", host, port)
            yield dict(host=host, port=port)
else:
    def listeners(hosts, port):
        daemon_fds = list(
            fd
            for fd in systemd.daemon.listen_fds()
            if systemd.daemon.is_socket_inet(
                fd,
                type=socket.SOCK_STREAM,
                listening=1,
            )
        )

        if len(daemon_fds) == 0:
            for host in hosts:
                _log.info("Starting server at %s on port %d", host, port)
                yield dict(host=host, port=port)
        else:
            _log.info("Starting server from systemd-provided file descriptors %r", daemon_fds)
            yield from (
                dict(sock=fd)
                for fd in daemon_fds
            )

次に、 ed dictrunをループします。yield

coros = []
for listener_args in listeners(hosts, port):
    coro = loop.create_server(factory, ssl=ssl_context, **listener_args)
    coros.append(coro)
coros.append(supervisor.startToServe())
results = loop.run_until_complete(asyncio.gather(*coros))
于 2016-12-03T17:18:33.420 に答える