处理层
一旦网络层读取传入消息并将其传递给 RespServerSession
类,Garnet 服务器的消息就会得到处理。
在一个会话中,TryConsumeMessages
方法负责通过以下方式处理传入消息:
- 测量和跟踪处理延迟,以及消耗的字节和执行的操作。
- 使用
ProcessMessages
方法进一步处理消息。 - 作为消息处理过程中发生的任何异常的捕获器。这确保了服务器持续运行,即使消息处理导致关键的未处理异常,并且所有资源都正确释放。
ProcessMessages
方法对传入数据进行快速解析,以快速识别正确的命令类型。根据命令的类型,由以下方法之一执行进一步处理。
-
ProcessBasicCommands
这包括 GET、SET、DEL、RENAME、EXISTS、EXPIRE、TTL、INCR、PING、MULTI、EXEC、QUIT 等命令。 -
ProcessArrayCommands
如果它不是上述基本命令之一,则会进行进一步解析以检查传入数据是否与任何数组命令匹配——与多个键相关的命令、使用对象存储操作的命令等,例如 MGET、MSET、KEYS、SCAN、ZADD、ZREM、LPUSH、HSET 等。 -
ProcessOtherCommands
这用于处理其余命令,包括ProcessAdminCommands
(用于 AUTH、CONFIG、CLUSTER 等命令)、自定义命令、自定义事务等。
此方法还跟踪会话级别指标,例如已处理的读取、写入和总命令数。还在此处执行事务相关操作,例如调用跳过、启动、停止和处理内部命令。有关更多详细信息,请参阅事务页面。
如上所述,一旦识别出初始命令,将由命令特定方法执行进一步处理。
命令处理的下一步由名为 Network[Command] 的方法执行。这些方法负责从传入网络缓冲区读取和解析命令特定参数。解析必要的参数后,它们调用底层存储层方法来执行命令操作。然后,它们还将响应消息以正确的 RESP 格式写回客户端。为此,它们使用网络发送器创建的缓冲区。例如,请参阅 BasicCommands.cs
中的 NetworkIncrement
方法。
存储层方法执行命令的实际处理逻辑。它们利用底层 Tsavorite 层的 API 来执行读取、RMW、Upset、删除等操作。此外,在 Tsavorite 回调中实现了额外的处理逻辑。例如,请参阅 MainStoreOps.cs
中的 Increment
方法和 MainStoreFunctions
中的相关方法。