質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
GlassFish

GlassFishは、Java EE準拠のアプリケーションサーバの名称です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

受付中

WebSocketの複数サーバー環境にて全クライアントにプッシュ通知を行いたい

sheltie
sheltie

総合スコア0

GlassFish

GlassFishは、Java EE準拠のアプリケーションサーバの名称です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

1回答

-1評価

0クリップ

1368閲覧

投稿2021/09/28 02:40

編集2022/01/12 10:55

前提・実現したいこと

WebSocketにてアプリケーションサーバーと常時接続しており、
随時リクエストとレスポンスの送受信を行うアプリを開発しています。
アプリケーションのイメージとしては、チャットや掲示板のようなもので、
リアルタイムに書き込み内容が他のクライアントへ反映されます。

クライアントからの書き込みに応じて他のクライアントへのプッシュ通知を行うのですが、
複数サーバー時にすべてのクライアントへプッシュ通知を行うことが実現できていません。

WebSocketにてプッシュ通知を行うアプリにおいて、複数サーバー時にすべてのクライアントへ通知を送信するには、どうすればよいでしょうか。

『接続形態』
・AP Server と Client は WebSocket にて常時接続している。
・AP Server は1台の場合もあれば、複数存在する場合もある。(クライアント数に応じて増設している)
・Client-A1, Client-A2 は AP Server-A に接続している。
・Client-B1, Client-B2 は AP Server-B に接続している。

text

+-------------+ +-----------+ | AP Server-A | | Client-A1 | <- WS -> | | +-----------+ | WebSockApp | | | +-----------+ | | | Client-A2 | <- WS -> | | +-------------+ +-----------+ | | <- JDBC -> | DB Server | +-------------+ | | | | +-------------+ | | +-----------+ | AP Server-B | <- JDBC -> | | | Client-B1 | <- WS -> | | +-------------+ +-----------+ | WebSockApp | | | +-----------+ | | | Client-B2 | <- WS -> | | +-----------+ | | +-------------+

実現できていること

・Client-A1 からの情報更新をトリガーにして、AP Server-A に接続している全クライアントへプッシュ通知を行う。
(この場合の通知対象は Client-A1, Client-A2)

・Client-B1 からの情報更新をトリガーにして、AP Server-B に接続している全クライアントへプッシュ通知を行う。
(この場合の通知対象は Client-B1, Client-B2)

発生している問題

・クライアントからの情報更新に応じて、すべての クライアントへプッシュ通知を行いたいが、実現できてない。
(この場合の通知対象は Client-A1, Client-A2, Client-B1, Client-B2)

考察

・AP Server-A からプッシュ通知が送信できるのは、自サーバーに接続しているクライアントのみ。

 『理由』
他サーバーに接続しているクライアントにはTCPコネクションが無いし、WebSocketのセッション情報も保持していないため。

試したこと・代替案

・すべてのクライアントが定期的にサーバーへリクエストを発行し、更新されていないかチェックする
→ この方法では無駄にサーバーの負荷が増大する。また、WebSocketを使用している意味が無いため、採用したくない。

・自サーバーに接続していないクライアントへのプッシュ通知要求が発生したときは、
APサーバーから他のAPサーバーへHTTP POST(Servlet等で中継)にてプッシュ通知の送信要求を連携する。
→ この方法ではサーバー数が増えるに従い無駄なPOSTリクエストが発生するため、採用したくない。

・自サーバーに接続していないクライアントへのプッシュ通知要求が発生したときの連携を、他のサーバーへHTTP POST(Servlet等で中継)ではなく
メッセージキューのPub/Subにて実施する。
→ 現在 ActiveMQ + リソースアダプタ + Message-driven Bean にて検証を実施中だが、安定して動作するかが不明。

補足情報(FW/ツールのバージョンなど)

・サーバーのOSは CentOS 8.2
・クライアントのOSは Windows10
・APサーバーのJavaバージョンは OpenJDK 1.8.0_252
・AP Server は GlassFish4系, Payara5系 (WebSocket実装はTyrus)
・Client は C#で自作 (WebSocket実装はwebsocket-sharp)

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

dodox86

2021/09/28 02:45

> → この方法ではサーバー数が増えるに従い無駄なPOSTリクエストが発生するため、採用したくない。 HTTPのPOSTメソッドに限らず、他サーバーへ通知するには何らかの通信が必要になる訳で、そういった経路は用意したくないということなのでしょうか。
jimbe

2021/09/28 03:35

プログラミング以前の問題で、SEらの「お仕事」のお話ではないでしょうか。
sheltie

2021/09/28 22:50

dodox86さん、質問ありがとうございます。 別の通信経路を用意するのは問題ありません。 ただ、連携時のサーバー負荷をできるだけ減らしたいです。 例えば、サーバーが3つで、下記のようにクライアントの接続数が偏っていて  サーバー1 <--> クライアント100台  サーバー2 <--> クライアントなし  サーバー3 <--> クライアント10台 (1) HTTP POSTで受け付けた連携処理に時間がかかってしまった (2) 多数のクライアントで同時期に更新がありプッシュ通知の連携要求が多発した のような場合、サーバー2にとっては(関係のないリクエストにより)DoSのような状態になってしまいます。 ※もちろん、このような場合はLB等で接続を分散させて平坦化するべきですが  クライアント数が偏ってしまう場合もありますので...
dodox86

2021/09/28 23:50

HTTPのように基本、リクエスト~レスポンスで回線をopen/closeするものでは負荷はまぁ少しは上がるでしょうけど、それが嫌なのであれば せっかくWebSocketを使っているのであれば、サーバー1~サーバーN間もWebSocketで繋げておけば良いんじゃないでしょうか。まとめられるメッセージはなるべくまとめるように工夫すればより負荷は下がります。同じマシン内ならプロセス間通信でもいいんじゃないでしょうか。どうしたってサーバー間で何らかの通信は発生します。
dodox86

2021/09/28 23:58

低評価はしていませんが、確かにまぁ、現状ちょっと漠然としていて質問と言うよりは設計や問題点の検討の依頼に読めなくはないですね。
sheltie

2021/09/29 16:32

別に「検討をしてくれ」「設計をしてくれ」という思いは全くありません。 個人で掲示板アプリを作成していくなかで、スケールアウトしてサーバー数が増えた場合に 実現したい機能をどのように実装すればよいか疑問が出てきたため、質問をした次第です。 ・世の一般的な(サーバー数が増減するような)WebSocketアプリでは、全クライアントへの同報ほどのように実現しているのか ・こういった方向で考えてみてはどうか?こういうアプローチではどうか?といった、考え方やおおよその方向性についての意見 といったような感じで、何か知見がありましたらご教示頂きたいと思っています。 それとも、ここ(teratail)では狭義の「プログラミング」に関することしか質問してはならず、 「どのように実現すればよいか」といった考え方についての質問はNGなのでしょうか?
jimbe

2021/09/29 18:11

> ここ(teratail)では狭義の「プログラミング」に関することしか質問してはならず ~ 私も単なる利用者ですので、それらを判断する権限はありません。 単なる個人の感想とご理解頂けると助かります。 また『「検討をしてくれ」「設計をしてくれ」』と仰っているとは捕らえておりません。というよりも逆に、マルチサーバ・負荷等も考慮しての「設計」は法人レベルでの経験やノウハウの現れる範囲ですので、それなりの所に依頼等をしたほうが "確実" なのでは…というのが私の考えです。 言ってみれば「〇〇に歩いていくにはどの道が良いでしょうか」とのご質問に「タクシー拾って行き先言ったほうが確実ではありませんか」と提案しているだけですので「いや、歩きますので」と言われれば「分かりました」と引き下がります。 大変失礼して申し訳ありませんでした。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

GlassFish

GlassFishは、Java EE準拠のアプリケーションサーバの名称です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。