Rails w /自定义TCP数据服务

时间:2010-07-27 13:40:54

标签: ruby-on-rails

我正在构建一个需要连接到自定义TCP数据服务的Rails应用程序,该服务使用XML消息来交换数据。从功能上讲,这不是一个问题,但我在设计方式上遇到了“干净”的问题。

简要概述:

用户登录Rails应用。登录时,将使用数据服务验证凭据,并返回“上下文ID”。

请求:

<login><username>testuser</username><password>mypass</password></login>

响应:

<reply><context_id>123456</context_id></reply>

这个context_id基本上是一个会话令牌。对此用户的所有后续请求必须在XML消息中提供此context_id。

请求:

<history><context_id>123456</context_id><start_date>1/1/2010</start_date><end_date>1/31/2010</end_date></history>

响应:

<reply><history_item>...</history_item><history_item>..</history_item></reply>

我已经隐藏了我的模型中的所有XML构建/解析,这非常有效。我可以将context_id存储在用户的会话中,并在我的控制器中检索它,并将其传递给模型函数。

@transactions = Transaction.find( { :context_id => 123456, :start_date => '1/1/2010', :end_date => '1/31/2010' } )

从设计的角度来看,我有两个问题需要解决:

  1. 将context_id传递给每个Model动作都有点痛苦。如果模型只能从会话本身检索id,那将是很好的,但我知道这会打破关注点分离规则。
  2. 每次请求都会由模型创建/销毁TcpSocket连接。连接没有直接绑定到context_id,所以如果套接字可以存储在某个地方并由模型检索它会很好,所以我不会为每个请求重新建立连接。
  3. 这可能听起来很复杂,我可能会说这一切都错了。如果有人有任何想法,我很乐意听到。

    技术细节:我正在运行Apache / mod_rails,我对TCP服务及其架构有0控制权。

1 个答案:

答案 0 :(得分:1)

考虑将API访问权移动到新类,并将TcpSocket实例和上下文ID存储在那里。更改模型以与此API访问类通信,而不是与套接字本身交谈。

向控制器添加around_filter,将会话中的上下文ID拉出会话,将其存储到API访问类中,并在运行操作后将其置为nils。只要您的Rails进程保持单线程,您就可以了。如果切换到多线程模型,您还需要更改API访问类,以在线程本地存储中存储上下文ID TcpSocket,您将需要每个帖子需要一个TcpSocket