原文: STOMP Protocol Specification, Version 1.2
摘要
STOMP是一个简单的可互操作的协议, 被用于通过中间服务器在客户端之间进行异步消息传递。它定义了一种在客户端与服务端进行消息传递的文本格式.
STOMP已经被使用了很多年,并且支持很多消息brokers
和客户端库。这个规范定义STOMP 1.2
协议以及对1.1
版本的更新。
发送反馈到stomp-spec@googlegroups.com
.
概述
背景
由于需要用脚本语言如Ruby
, Python
, Perl
去连接企业级的消息brokers
, STOMP产生了.在这种情况下,STMOP实现了一些简单的操作,比如可靠地发送单一的消息,然后断开或者从目的地消费所有消息。
STOMP是除AMQP
开放消息协议之外地另外一个选择, 实现了被用在JMS brokers中特定的有线协议,比如OpenWire
. 它仅仅是实现通用消息操作中的一部分,并非想要覆盖全面的消息API.
STOMP目前已经是个成熟的协议,在wire-level
方面, 它提供了一些简单的用例,但仍保持其核心设计原则:简单性和互操作性。 ### 协议概述
STOMP是基于frame的协议, 与HTTP的frame相似.一个frame
包含一个command
,一系列可选的headers
和body
.STOMP虽然是基于消息但同于也允许传递二进制消息。STMOP的默认消息格式是UTF-8
,但是在消息体中同样支持其他格式编码。
STOMP服务器就好像是一系列的目的地, 消息会被发送到这里。STOMP协议把目的地当作不透明的字符串,其语法是服务端具体的实现。 此外STOMP没有定义目的地的交付语义是什么。 交付,或“消息交换”,语义的目的地可以从服务器到服务器,甚至从目的地到目的地。这使得服务器有可创造性的语义,去支持STOMP。
STOMP client的用户代理可以充当两个角色(可能同时): * 作为生产者,通过SEND
frame发送消息到server * 作为消费者,发送SUBSCRIBE
frame到目的地并且通过MESSAGE
frame从server获取消息。
STOMP版本之间的变化
STOMP 1.2 大部分向后兼容1.1. 有两点不兼容的改变: * 用回车加换行符代替只用换行符结束frame * 简化了消息应答,用专用的header
除此之外,STOMP 1.2并没有增加新特性,而是阐述规格中的一些模糊概念,比如: * 重复的frame header条目 * content-length
和content-type
headers的用法 * 必须支持servers STOMP frame * 连接延迟 * 作用域,订阅的唯一,事务的标示符 *RECEIPT
frame的含义
设计哲学
简易性,互通性是STOMP主要设计哲学.
STOMP被设计成为轻量级的协议,它很容易用其他语言在client和server实现。这就意味着servers的架构没有太多的约束,以及没有太多的特性比如目的地命名空间,可靠的语法需要去实现。
在这份规格书里面,注意,我们没有明确定义的STOMP 1.2 servers特性。你应该查阅STMOMP servers 文档去获得这些特性的详细描述。
一致性
RFC 2119中详细地解释了MUST
, MUST NOT
, REQUIRED
, SHALL
, SHALL NOT
, SHOULD
, SHOULD NOT
,RECOMMENDED
, MAY
, 和 OPTIONAL
这些关键字
为了阻止来自服务端地攻击,保护内存溢出,消除平台限制,限制了不受约束的输入。
规格中一致性的级别适用于STOMP clients and STOMP servers.
STOMP Frames
STOMP是基于帧的协议,它假定底层为一个2-way的可靠流的网络协议(如TCP)。客户端和服务器通信使用STOMP帧流通讯。帧的结构看起来像:
COMMAND
header1:value1
header2:value2
Body^@
帧以command字符串开始,以EOL结束,其中包括可选回车符(13字节),紧接着是换行符(10字节)。command下面是0个或多个