クライアントとサービス間のゲートウェイとのSocketIO通信?


8

要旨

マイクロサービスベースのアーキテクチャ(Kubernetes)で実行されるアプリケーションがあります。アプリケーションの外部とのすべての通信は、API Gatewayを介して行われます

つまり、私のフロントエンドからのリクエストはサービスに直接送信されませんが、ゲートウェイを経由する必要があります。

動かす

次に、フロントエンドと内部サービス間のリアルタイム通信を必要とする機能を実装する必要があります。しかし、内部サービスは外部に公開されていないため、ゲートウェイを介してリアルタイムデータを「ルーティング」する方法が必要です。

すべてのサービスがNode.jsで実行されているため、Socket.IOを使用してリアルタイム通信を実装したいのです。

建築

問題

しかし、スケッチから紫色の二重矢印を実装する方法は?

そのため、通常、フロントエンドクライアントは、Socket.IOが実行されているサーバーに接続します。しかし、私の場合、このサーバー(リアルタイム機能サーバー)はクライアントからアクセスできません(アクセスできないはずです)。つまり、クライアントはゲートウェイに接続する必要があります。したがって、ゲートウェイは、すべての着信メッセージをリアルタイムサービスとその逆にルーティングするメカニズムを実装する必要があります。

アイデア

(1)ゲートウェイでイベントをリッスンする2番目のHTTPサーバーを用意し、それらのイベントをリアルタイムサーバーに送信します。反対の方向では、リアルタイムサーバーはゲートウェイにイベントを発行し、ゲートウェイはそれをフロントエンドに発行し​​ます。このアプローチは間違いなくうまくいくと思いますが、すべてを2回放出するのは冗長なようです。そして、それは間違いなくパフォーマンスを損なうでしょうか?

(2)Socket.IOアダプターを使用して「ノード間でイベントを渡す」。これは「プロセスまたはコンピューター間でメッセージを渡す」ために使用されるため、正しい方法と思われます。しかし、ドキュメントやサンプルが不足しているため、使用を開始するのに問題があります。私もRedisを使用していません(アダプターを使用するために必要ですか?)

(3)socket.io-emitterパッケージを使用します。これは、最後のコミットが3年前からあったため、良いオプションとは思えません。

(4)他に何かありますか?


では、API Gatewayを使用してトラフィックをリダイレクトする必要がありますか?私たちは、pourアプリケーションにsocket.ioを実装していますが、サービスは別のサービス(ポッド)にデプロイされています。ingress-controllerk8sを使用すると、socketトラフィックがサッカーサービスに送信されます。
Giorgio Cerruti

@GiorgioCerrutiありません私はしていない持っているゲートウェイを使用するが、これは私が仕事に自分のアプリケーションを計画する方法です。では、Ingressで「内部サービス」を公開することをお勧めしますか?
Florian Ludewig

nginxイングレスコントローラーとして使用しました。必要に応じてhaproxyも使用できます。2つのサービス(デプロイメント)があり、1つはHTTP(s)リクエストを管理し、もう1つはソケットリクエストを管理します。Ingressを使用すると、パスを公開し、トラフィックを適切なサービス/socketにリダイレクトできsocket-serviceます。たとえば、ヒットしたリクエストはすべてアプリケーションにリダイレクトされます。
Giorgio Cerruti

私はすでにnginx Ingressを使用しているので、それは何かおかしなことのように聞こえます。それを実装する方法を示す回答を投稿できればすばらしいでしょう(これは私が現在使用している入力構成です:github.com/flolu/centsideas/blob/…
Florian Ludewig

回答:


3

よし、基本的にはこのようにアプリケーションを設計した

イングレス

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: centsideas-ingress
  annotations:
    kubernetes.io/tls-acme: 'true'
    kubernetes.io/ingress.class: 'nginx'
    cert-manager.io/cluster-issuer: letsencrypt
spec:
  tls:
    - hosts:
        - centsideas.com
        - api.centsideas.com
      secretName: centsideas-tls
  rules:
    - host: api.centsideas.com
      http:
        paths:
          - path: /socker.io
            backend: 
             serviceName: socket-service
             servicePort: 8000
          -  path: /
             backend:
              serviceName: centsideas-gateway
              servicePort: 3000
    - host: centsideas.com
      http:
        paths:
          - backend:
              serviceName: centsideas-client
              servicePort: 8080

サービス

apiVersion: v1
kind: Service
metadata:
 name: socket-service
 annotations:
  service.beta.kubernetes.io/external-traffic: "OnlyLocal" 
 namespace: namespace
spec:
 sessionAffinity: ClientIP
 ports:
  - name: ws-port
    protocol: TCP
    port: 8000
 type: ClusterIP
 selector:
  service: ws-api

次に、ws-serviceをデプロイするデプロイメントを作成します。このように、k8s HPA(水平ポッド自動スケーリング)をアクティブにして、socket.ioサービスをスケールアップすることもできます。k8sのバージョンに基づいて、アノテーションやその他のオプションを変更する必要があります(アノテーションservice.beta.kubernetes.io/external-traffic: "OnlyLocal"は非推奨になっていると思います)。


良いね!明確にするために:Webソケットを必要とするすべての内部サービスについて、別のものsocket-serviceを追加してIngressに追加しますか?
Florian Ludewig

場合によります。新しいサービス(新しいコードベース)を公開する必要がある場合は、マイクロサービスごとに新しいk8sサービスを作成する必要があります。代わりに、socket.ioアプリケーションをスケールアップする必要がある場合(同じコードベースのインスタンスをさらに作成する)は、必要ありません。サービスは基本的に、iptablesを使用してk8sによって作成されたLoadBalancerであり、リクエスト/リソースでビジーでないポッドを独自に決定することにより、インスタンス間でリクエストのバランスをとります。
Giorgio Cerruti

理にかなっています、それはユースケースに依存します:)だから私は私が他のいくつかの答えを得ることができるように数日待つでしょう。賞金がもらえない場合は、ありがとうございます!
Florian Ludewig

0

内部サービスは外部に公開されていないため、トンネルの使用をお勧めします。ngrokは、NATまたはファイアウォールを介したローカルホストサーバーへのインスタントで安全なURLのコマンドです。サーバーが特定のポートを介してソケットサービスを公開している場合、ngrokを使用してリバースプロキシを作成し、フロントエンドアプリケーションに接続できる世界を公開します。このコマンドの使用方法は非常に簡単です。使用方法の例を次に示します。

  1. ngrokファイルを登録し、次のアドレスでダウンロードしてください。公式サイト
  2. 次の命令を実行して機能させるだけです

    ./ngrok http 3000

  3. 永続化するには、サービスを作成し、ngrok.ymlファイルを使用して最適な構成にする必要があります。

公式ドキュメントはこちら


私の答えはおそらく正確ではなかったでしょう。あなたのアプローチはうまくいくかもしれませんが、内部サービスは内部にとどまる必要があります。外部から誰も直接接続して話をすることはできません
Florian Ludewig
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.