如何为简单的API处理语言间RPC协议设计?

时间:2013-12-02 15:16:00

标签: c# python protocols rpc

我正在创建一个(非常基本的)分布式应用程序,它有一个Python服务器和一个C#客户端通过json over ZeroMQ相互通信。在客户端调用方法时,它会组成一条消息并将其发送到执行相应函数的服务器,因此它基本上是一种RPC。

要了解如何处理这些消息,该应用程序依赖于在客户端和服务器端重复的“协议”(实际上是一组关键字),如下所示:

namespace Draftsocket
{
    public static class Protocol
    {
        public struct ClientAction
        {
            //client-issued action lines
            public const string CMD = "COMMAND";
            public const string ERROR = "CLIENT_ERROR";
            public const string EVENT = "EVENT";
            public const string CONTINUE = "CONTINUE";
            public const string CONSOLE = "CONSOLE";
        }
    ...etc...

link to complete file in C#

class Protocol(object):

    class ClientAction:
        CMD = "COMMAND"
        ERROR = "CLIENT_ERROR"
        EVENT = "EVENT"
        CONTINUE = "CONTINUE"
        CONSOLE = "CONSOLE"
...etc...

link to complete file in Python

然后用它来撰写和阅读消息,如下所示:

public static ClientMessage NewCommand(string Name)
{
    return new ClientMessage(Protocol.ClientAction.CMD, Protocol.Status.OK, Name);
}

这暂时适用但通常很糟糕:对于想要使用该应用程序作为构建框架的任何人来说,字符串类型和不方便。

我无法决定如何以一种自动化/同步语言特定实现的方式重构此协议,或者,如果协议不同步/过时,则会发出警告?

猜猜我应该查看Enum和/或MessagePack实现的那种东西,但我觉得我没有足够的资格自行继续这个。

TIA。

1 个答案:

答案 0 :(得分:2)

我会使用protobuf或thrift。它们旨在解决不同平台之间的数据交换问题。请参阅此示例:Biggest differences of Thrift vs Protocol Buffers?