你可以将 Rails 用于数据处理系统(存储消息等)
昨晚我在想这件事:
- Rails 将创建一系列endpoints
- 当您的“设备”想要通信时,它必须向端点发起请求
- 设备将推送到 Rails 端点
设备
在不知道设备是什么的情况下,我想象它的工作方式是它必须能够在发生某些事情时发起 POST 请求(想象 Rasberry Pi 发送数据)
如果您的设备是牙刷,则您必须具备(芯片上或外部)功能才能连接到网络并将数据发送到您的(插入框架)服务器
导轨
Rails 可以这样处理(这是我们的一些实时分析系统代码,其工作方式类似):
#config/routes.rb
post "/update", to: "messages#create"
#app/controllers/messages_controller.rb
protect_from_forgery with: :null_session
before_action :authenticate
#Data
def create
#create message here
end
private
# have to give x a "token"
def authenticate
authenticate_or_request_with_http_token do |token, options|
user = User.exists?(public_key: token)
@token = token if user
end
end
这将创建端点:
domain.com/update
您必须在标头中发送您的authentication token,并且可能需要使用rack-CORS(或另一个CORS 策略管理器)来处理x 域事务:
#config/application.rb
config.middleware.use Rack::Cors do
allow do
origins '*'
resource '/update*', :headers => :any, :methods => :post
end
end
数据
Rails 的东西是 MVC application(可以根据您的后端服务器资源进行扩展)
当您想将设备集成到后端时,棘手的部分就来了。你提到你可以支持http请求——诀窍是“如何”
- 您必须集成一些身份验证(可能是序列号),这些身份验证必须存在于您的 Rails 数据库中
- 然后这将通过设备通过网络发送到您的端点
- 收到请求后,Rails 可以在服务器上处理它并返回响应
所以最大的问题是——您的设备将如何与服务器通信?
交叉沟通
Server -> Device通讯为push technology:
- 设备将 ping “直播”(通过浏览器中的 JS,在其他浏览器中不确定)
- 服务器会将数据发送到特定的“通道”
- 如果设备订阅了频道,它将收到更新
问题不在于“网络套接字”技术,而在于"sub/pub"
在浏览器世界中,您基本上会打开与 Javascript 的永久连接。这可以通过使用SSE's(美化long-polling)或websockets来完成
两者都可以通过“收听”您频道上的事件来访问:
#Pusher
channel.bind('my-event', function(data) {
alert('An event was triggered with message: ' + data.message);
});
#SSE's
var source = new EventSource("demo_sse.php");
source.onmessage = function(event) {
document.getElementById("result").innerHTML + =event.data + "<br>";
};
就您的设备而言,我会查看您希望从服务器接收数据的频率。当然,发送数据是一种“按需”服务,但正如你所说,接收确实会带来开销
如果您只希望每天收到一条消息,我会考虑使用某种long-polling 技术每隔x 小时查找一次数据;如果您立即需要该消息,我会考虑将持久连接与 Web 套接字集成
服务器
在服务器上处理这个将归结为您的服务器可以处理多少并发连接
如果您使用 AWS,您将能够相对简单地进行扩展,但每个连接都将被归类为“并发”