流星pub/sub机制是在服务器上跨包共享信息的绝佳方式,而无需与其他包共享包实现细节。
我想对安全敏感的数据使用发布/订阅机制。此敏感主题只能由不同的服务器组件发布和订阅。即客户不能订阅敏感话题。
由于恶意用户可以更改客户端代码,因此服务器必须明确阻止客户端成功订阅敏感主题。
如何将主题设为服务器专用?
更新(针对@alanning):
为什么我喜欢pub/sub(部分列表):
- pub/sub是减少大型项目中耦合的一种简单方法。包/模块/任何不知道谁在处理它们的输出或请求(或在哪里)的东西-重构很容易,因为唯一的入口点在主题级别,而不是代码级别
- pub/sub允许在不同的VM上处理请求,而无需特殊的编码更改
- pub/sub提供了一种简单的方法,可以在服务器处于高负载时将某些类型的请求路由到/dev/null
- 易于测试的模拟点
- 数据生成器不需要知道数据是如何使用的
- 1-N个消费者,而生产者不知道多个消费者
流星内:
我希望能够使用流星酒吧/酒吧机制,因为:
- 重用代码非常棒
- 流星酒吧/酒吧有德普机制(真棒^2)
- 流星酒吧/酒吧包括传输机制(服务器到服务器的通信是免费的吗?)
- 流星团队正在增强它——所以我没有——嘿,我很懒
- 运行其他技术的其他服务器也可以加入进来。(apachesolr,hadoop?)
但悲伤:
- 客户端不安全
- 某些主题需要进行身份验证
- 有些主题是服务器内部的,所以不需要为传输打包数据的开销
Meteor.subscribe
仅在客户端可用,而在服务器上不可用
http://docs.meteor.com/#meteor_subscribe
-更新2-
同一进程内代码之间的消息传递
Nodejs提供了EventEmitter,它允许设置自定义事件。导入"events"包和"util"包以设置继承,如下所示:
util.inherits(MyQueue, EventEmitter);
以下是如何导入这些npm包:
Meteor封装中的Npm.require('events')
Meteor.require('events')
在使用npm
陨石包的Meteor应用中下面是一个使用它来侦听redis队列的示例。设置自己的队列主要是关于发布和收听哪些事件的约定
-更新1-
在不同进程中运行的代码之间传递消息
pub/sub队列绝对是一个不错的选择,您有几种方法可以实现这一点。我想到了两个:
- 使用Mongo集合实现穷人队列
- 使用第三方消息队列,如RabbitMQ
Mongo集合
根据您的需求,使用Mongo是可能的。快速搜索会带来几个实现和设计讨论(主要是Ruby):https://www.google.com/search?q=pubsub+用+mongo排队。小心点,不过。。。从长远来看,这可能会成为更多的工作。取决于您需要什么功能。
第三方消息队列
实际的队列解决方案提供了启用分布式消息传递的最佳方式。您可以设置一个RabbitMQ集群,Meteor进程与该集群交互以分发工作。提供良好的好处,如高可用性和有保证的交付。此外,工人不必是nodejs进程;任何AMPQ客户端都可以接收任务。
我使用Accounts系统来完成此操作。在服务器上,我创建了一个管理员帐户,并向其添加了一个admin : true
属性(在配置文件之外,因此它不可由用户更改)。
我的Meteor.publish
代码检查this.userId
,在此id上执行Meteor.users
查找,并确保存在admin : true
属性。如果找不到此属性,则返回一个空游标。
虽然从技术上讲,客户端可以订阅,但只需设法获得管理员帐户的用户名/密码。这样做的好处是不涉及任何黑客代码。