ネット猫の学習記録


本プロジェクトではWebsocatを使用します.プロジェクトの準備中、websocatを勉強しています.それを記録したいです.

Websocatとは?


websocatは、クライアントとサーバとの間でメッセージを交換する通信方法の一つである.非同期処理通信により,効率的なリアルタイム双方向通信を実現した.WebSocketはW 3 CとIETFによって制定された標準プロトコルであるため、現在インターネットを使用している環境でよく使用されている.
リアルタイム通信の特性上、チャット、株式、ビデオなどの処理に用いられ、複数の端末(PC、スマートフォン)間でデータを迅速に交換する必要があるリアルタイム処理に用いられる.
Web socatメッセージは、テキストデータまたはバイナリデータを処理することができる.
情報ソース
blog.2016
blog.2019

関連概念


同期-非同期通信



(1)同期通信


通常、クライアントとサーバの通信方式は同期されます.同期とは、リクエストが存在する場合にレスポンスを同時に処理する方法です.この同期方式では、1つのThread(Thread)が要求を受信すると、サーバが応答するのを待つ.Threadが応答を受け取るまで何もできない状態をBlock状態と呼ぶ.
このBlockメソッドは、要求に対する応答を保証することができる.応答が失敗しても、対応する失敗値が得られます.したがって、同期通信は、要求に応答する環境を確保する必要がある場合に非常に適している.(金融決済等)

(2)非同期通信


Web socatが使用する非同期通信方式は,要求と応答が異なる通信方式である.スレッドは、リクエストを転送して応答を待つのではなく、次のリクエストを転送し続けることができます.これらのスレッドの状態をNon Block状態と呼ぶ.
Non Blockの特性上、順番に遅れた要求は、先に来た要求よりも先に応答する可能性がある.非同期はリクエストの処理順序を保証しません.
また,Non Blockの特性のため,同期の性能よりも非同期の性能が優れている.しかし、同期は、大量の応答保証を必要とするサービスの理想的な選択ではありません.
情報ソース
blog.2018
blod.2021

アヒルの毛羽


originはサーバの位置を表します.Web環境では、サーバの位置はurlで表すことができますが、私たちがよく出会うurlの特定の部分はoriginです.

この図ではよく表現されており、url全体でprotocol、hostname、portの3つを総称してoriginと呼ぶ.
情報ソース
blog.2020
javascript.info

Webストレージ


Webを開発する場合、サーバやデータベースに格納する必要がなく、重要でないデータや紛失する可能性があります.サーバとデータベースのリソースを使用してこれらのデータを格納するのは無駄なので、クライアント側がデータを格納する空間はWebストレージです.
Webツリータイプには、ローカルストレージとセッションストレージが含まれます.セッションは、Webページのセッション終了時に格納されたデータを削除し、ローカルに格納されたWebページのセッション終了時にデータは削除されません.
セッションストレージは、各ブラウザウィンドウで分離されていますが、ローカルストレージはすべてのブラウザウィンドウで共有されます.したがって、ブラウザを閉じてもデータは保持されます.ただし、これらのローカルストレージのデータ持続性は、同じブラウザを継続して使用する場合にのみ有効です.同じコンピュータ上で異なるブラウザを使用すると、異なるローカルストレージにデータが格納されます.
blog.2020

CORS


クロスソースリソース共有(Cross-Origin Resource Sharing)はSOPポリシーの例外であり、CORSを遵守しない場合、Orijinは他のサーバとクライアント間のコミュニケーションでサーバの応答を破棄します.
SOP(Same-Origin Policy)は、2011年にRFC 6454で初めて登場したセキュリティポリシーである「同じソースでしかリソースを共有できない」ということです.
しかし、Webというオープンスペース環境では、他のソースからのリソースの取得と使用は非常に一般的であり、盲目的に阻止することはできないため、これらのソースが異なる場合でも、対応するリソースリクエストを許可する例外を許可することにした.その一つが「CORS政策の遵守を求める資源」だ.
情報ソース
blog.2020

STOMP


STOMP(Streaming、または単純テキストオブジェクト向けメッセージプロトコル)およびWeb socatは、HTTPではなくSTOMPが通信できるようにする.
STOMP

Message Broker


Websocat、クラウドネイティブ、Microsoftベース、サーバなし、ハイブリッドクラウドアーキテクチャに適用
Message Agentは、アプリケーション、システム、およびサービス間で通信および情報交換を行うソフトウェアです.Message Agentは、構造化されたメッセージ・プロトコル(正式なメッセージング・プロトコル)間でメッセージを変換することによって、これらの操作を実行します.Message Agentによって、異なる言語やプラットフォームで相互依存のサービスを実施しても、「会話」が可能になります.
A message broker is software that enables applications, systems, and services to communicate with each other and exchange information. The message broker does this by translating messages between formal messaging protocols. This allows interdependent services to “talk” with one another directly, even if they were written in different languages or implemented on different platforms.
IBM

messaging middleware


メッセージングミドルウェアまたはメッセージ向けミドルウェア

SpringBootとWebSocket

/**
 * @EnableWebSocketMessageBroker enables WebSocket message handling, backed by a message broker.
 * what is message broker?
 *
 */
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic");
        config.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/gs-guide-websocket").withSockJS();
    }
/**
 * The configureMessageBroker() : message broker를 설정(config) 하기 위한 메서드이다.
 *
 * enableSimpleBroker : to enable a simple memory-based message broker
 *                      to carry the greeting messages back to the client on destinations prefixed with /topic
 *                      그외에 어떤 Broker 설정이 있을까
 *
 * setApplicationDestinationPrefixes : 모든 @MessageMapping 에 묶여있는 메시지 핸들러에 prefix 적용, 즉,
 *                                     아래의 Controller 메서드는 /app/hello 에서 message를 받는다. (endpoint)
 *
 *  @MessageMapping("/hello")
 *  @SendTo("/topic/greetings") // 여기로 보낸다.
 *     public Greeting greeting(HelloMessage message) {...}
 *
 *
 * The registerStompEndpoints() : method registers the /gs-guide-websocket endpoint,
 *                                enabling SockJS fallback options so that alternate transports can be used
 *                                if WebSocket is not available. The SockJS client will attempt to connect
 *                                to /gs-guide-websocket and use the best available transport
 *                                (websocket, xhr-streaming, xhr-polling, and so on).
 */
}
@Controller
public class GreetingController {
    /**
     * The @MessageMapping annotation ensures that,
     * if a message is sent to the '/hello' destination, the greeting() method is called.
     *
     * The return value is broadcast to all subscribers of /topic/greetings,
     * as specified in the @SendTo annotation
     */
    @MessageMapping("/hello") // 여기서 받아서
    @SendTo("/topic/greetings") // 여기로 보낸다.
    public Greeting greeting(HelloMessage message) throws Exception {
        Thread.sleep(1000); // simulated delay
        return new Greeting("Hello, " + HtmlUtils.htmlEscape(message.getName()) + "!");
    }

}
なぜ同じURLにメッセージが表示されるのか、SendToとして受信した場合、URLを変更する必要はありません
Spring Quick Start Guide