arangodb erlang数据库驱动
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

187 lignes
8.2 KiB

il y a 4 ans
  1. Client / Server Communication (VST 1.1)
  2. =======================================
  3. Version 1.1.0 of 23 November 2016
  4. # HTTP
  5. 使用VelocyPack作为身体。内容类型为"application/vpack"
  6. Binary Protocol
  7. ---------------
  8. 这不是请求/响应协议。它是对称的(原则上)。消息可以来回发送,流水线,多路复用,单向或双向。
  9. 可能会生成一条消息
  10. 没有反应
  11. 只是一个回应
  12. 多重回应
  13. 该VelocyStream并没有强加或指定或要求上述行为之一。
  14. 应用程序必须在一般情况下或根据每个请求定义行为,
  15. 请参见下文。然后,服务器和客户端必须实现该行为。
  16. ### Message vs. Chunk
  17. 使用者(客户端或服务器)将处理消息。一条消息包含一个或多个VelocyPack(在某些情况下是二进制数据的某些部分)。
  18. 消息中有多少VelocyPacks完全取决于应用程序,请参阅下文了解ArangoDB。
  19. 消息可能很大。由于可以通过一个连接对消息进行多路复用,因此需要将大消息拆分为多个块。
  20. 发送者/接收者类将接受一个VelocyPacks向量,将其分割成块,通过导线发送这些块,组装这些块,
  21. 生成一个VelocyPacks向量并将其传递给消费者。
  22. ### Chunks
  23. 为了允许重组块,每个程序包都以一个 header 作为前缀。块始终至少为24个字节长。字节顺序始终是小端。
  24. 块的格式如下,无论它是消息中的第一个消息还是随后的消息:
  25. 名称 类型 描述
  26. length uint32_t 当前块(包括此标头)的总长度(以字节为单位)
  27. chunkX uint32_t chunk / isFirstChunk(高31位/最低位),详细信息请参见下文
  28. messageId uint64_t 唯一标识符,发送方有责任生成这样的标识符(zero is reserved for not set ID)
  29. messageLength uint64_t the total size of the message.
  30. Binary data binary data blob size b1 |
  31. 声明:"chunk" and "isFirstChunk" are combined into an unsigned 32bit value.
  32. Therefore it will be encoded as
  33. uint32_t chunkX and extracted as
  34. chunk = chunkX >> 1
  35. isFirstChunk = chunkX & 0x1
  36. 对于消息的第一块,设置第二个uint32_t的低位,对于所有后续消息,将其复位。
  37. 在消息的第一个块中,数字 chunk 是消息中的块总数,在所有后续块中,数字 chunk 是该块的当前number。
  38. 数据包的总大小为(24 + b1)字节。此数字存储在length字段中。
  39. 如果需要发送大于UINT32_MAX的消息,则必须将这些消息分块。通常,最好将最大大小限制为几兆字节。
  40. ### **Notes:**
  41. 发送(小)消息时,(出于性能原因)确保仅发送一个TCP数据包非常重要。
  42. 例如,通过在Linux下使用sendmmsg
  43. ([https://blog.cloudflare.com/how-to-receive-a-million-packets](https://blog.cloudflare.com/how-to-receive-a-million-packets/))
  44. 但是,实现者应该意识到,在TCP / IP中不能强制执行此操作,因此实现者必须始终意识到,
  45. 网络堆栈的某些部分可以拆分数据包,并且有效负载可能分成多个部分!
  46. ArangoDB
  47. ========
  48. ### Request / Response
  49. 对于ArangoDB客户端,请求的格式如下,该数组是VelocyPack数组:
  50. [
  51. /* 0 - version: */ 1, // [int]
  52. /* 1 - type: */ 1, // [int] 1=Req, 2=Res,..
  53. /* 2 - database: */ "test", // [string]
  54. /* 3 - requestType: */ 1, // [int] 0=Delete, ...
  55. /* 4 - request: */ "/_api/collection", // [string\]
  56. /* 5 - parameter: */ { force: true }, // [[string]->[string]] http的请求参数列表
  57. /* 6 - meta: */ { x-arangodb: true } // [[string]->[string]] http的header
  58. ]
  59. Body (binary data)
  60. 如果数据库未设置(entry is `null`),则数据库为“ _system”。
  61. #### type:
  62. 1 = Request
  63. 2 = Response (final response for this message id)
  64. 3 = Response (but at least one more response will follow)
  65. 1000 = Authentication
  66. #### requestType:
  67. 0 = DELETE
  68. 1 = GET
  69. 2 = POST
  70. 3 = PUT
  71. 4 = HEAD (not used in VPP)
  72. 5 = PATCH
  73. 6 = OPTIONS (not used in VPP)
  74. ### For example:
  75. HTTP请求
  76. http://localhost:8529/_db/test/_admin/echo?a=1&b=2&c[]=1&c[]=3
  77. With header::
  78. X-ArangoDB-Async: true
  79. is equivalent to
  80. [
  81. 1, // version
  82. 1, // type
  83. "test", // database
  84. 1, // requestType GET
  85. "/_admin/echo", // request path
  86. { // parameters
  87. a: 1,
  88. b: 2,
  89. c: [ 1, 3 ]
  90. },
  91. { // meta
  92. x-arangodb-async: true
  93. }
  94. ]
  95. 该请求是一条以VelocyPack开头的消息。这个VelocyPack始终包含标题字段,参数和请求路径。
  96. 如果meta字段不包含内容类型,则采用默认值 "application/vpack",并且正文将是一个或多个VelocyPack对象。
  97. #### The response will be
  98. [
  99. 1, // 0 - version
  100. 2 or 3, // 1 - type
  101. 400, // 2 - responseCode
  102. { etag: "1234" } // 3 - meta: [[str]->[str]]
  103. ]
  104. #### Body (binary data)
  105. 请求可以通过管道传输或混合。使用标头中的“ messageId”映射响应。发送者有责任生成合适的“ messageId”值。
  106. 默认内容类型为"application/vpack"。
  107. ### Authentication
  108. A connection can be authenticated with the following message:
  109. [
  110. 1, // version
  111. 1000, // type
  112. "plain", // encryption
  113. "admin", // user
  114. "plaintext", // password
  115. ]
  116. or
  117. [
  118. 1, // version
  119. 1000, // type
  120. "jwt", // encryption
  121. "abcd..." // token
  122. ]
  123. The response is
  124. { "error": false }
  125. if successful or
  126. {
  127. "error": true,
  128. "errorMessage": "MESSAGE",
  129. "errorCode": CODE
  130. }
  131. 如果不成功,则在这种情况下服务器将关闭连接。可以使用/_open/auth与HTTP版本相同的语义,使用未经身份验证的开放式路由,以与HTTP相同的方式获取JWT令牌。这样,可以通过JWT在单个会话中完成完整的身份验证。
  132. ### Content-Type and Accept
  133. 通常,内容类型将是VPP,即主体是存储为VelocyPack的对象。
  134. 有时有必要使用非结构化数据(例如文本,css或html)进行响应。主体将是一个仅包含二进制属性的VelocyPack对象,并将相应地设置content-type。
  135. 规则如下。
  136. #### Http
  137. Request: Content-Type
  138. "application/json"`: the body contains the JSON string representation
  139. `"application/vpack"`: the body contains a velocy pack
  140. 有一些处理程序允许JSON列表(由换行符分隔)。在这种情况下,我们还允许不使用任何分隔符的多个速度包。
  141. Request: Accept
  142. "application/json":如果可能,在正文中发送JSON字符串表示形式
  143. "application/vpack":如果可能的话,在体内发送速度包
  144. 如果请求是"application/json"或"application/vpack"处理程序产生了其他请求(即"application/html"),那么将忽略接受。
  145. 如果请求被请求"application/json"并且处理程序产生 "application/vpack",则VPACK将转换为JSON。
  146. 如果请求被请求"application/vpack",并且处理程序生成“ application / json”,则JSON将转换为VPACK。
  147. #### VPP
  148. 与HTTP相似,不同之处在于:不支持“ Accept”标头,并且"application/json"始终将其转换为“ application / vpack”。这意味着主体包含一个或多个速度包。通常,它将包含一个-值得注意的例外是导入。
  149. 如果处理程序产生了其他东西(即"application/html"),则主体将是一个二进制blob(而不是一个velocy-pack),并且将相应地设置content-type。
  150. 连接后发送的第一个字节(“客户端”端-即使程序是双向的,也有服务器在监听端口,而客户端在连接端口)
  151. VST/1.1\r\n\r\n
  152. (11 Bytes)