【问题标题】:Should I be using a queue for this...?我应该为此使用队列吗...?
【发布时间】:2011-05-21 10:04:52
【问题描述】:

我正在开发一个处理“敏感”数据(又名信用卡号)的应用程序,为了达到 PCI 合规性,我们需要确保我们的数据库与我们的公共服务器分开。

为了让数据进入并被存储,中间需要有一些东西——我不想让数据直接从网络/应用服务器写入或读取——所以我想知道是否队列/工作者架构可能是合适的。

基本流程是:

  1. 来自客户端的数据 -> 发送到 API
  2. API 服务器将数据放入“请求”对象 -> 入队
  3. 工作人员(在“内部”网络上)接收请求,写入数据库,执行工作,更新数据库,然后将“响应”对象排入队列
  4. API 服务器收到此响应对象,然后将响应返回给客户端

基本上我希望数据将返回到相同的“请求”,以便整个过程可以在一个请求中完成,但这似乎违背了消息队列的异步性质,并且可能是更适合作为严格“协议”的“网络服务”本身...

编辑我可能应该补充一点,我需要以下内容:

  • 持久性 - 如果队列或任何“崩溃”,它应该能够恢复“排队”项目
  • 安全 - 需要保护敏感数据 - 传输很好,因为我们可以在传输层(TLS、SSL、IPSec)上使用一些东西,但是在发送方(公共网络)存储卡号并不理想。 ..
  • 速度 - 当然。

那么,我是不是走错了路?

【问题讨论】:

  • 纯粹出于兴趣:您正在反对的 PCI 规范 - 它是否提供了任何指导,建议采用首选方法(或应避免的方法)?

标签: architecture message-queue


【解决方案1】:

我可能误解了这个问题,但归根结底,我认为您可能过度思考了这个问题。有一些方法可以将 Web 应用程序服务器公开到 Internet,同时在防火墙后面保持数据库安全,使用某种 SOA 可以增加隔离,并希望减少某种 sql 注入攻击的可能性,但事实并非如此自动的。引入一个队列,可以配置为持久的,给你想要的恢复,有的可以配置为同步的,这样就可以满足“一步”,或者至少是伪一步操作。但事实是,持久性增加了另一个“安全漏洞”,因为队列中的信息被写入某处,通常是数据库或文件系统,直到事务被提交。因此,在您假设发生崩溃的情况下,是的,它是可以恢复的,但企业内部有权访问临时存储该信息的文件系统区域的人可能会看到它。

【讨论】:

    【解决方案2】:

    虽然我不能说你应该,但听起来你确实可以使用一个效果很好。

    队列将为您提供组件之间的一定程度的隔离。如果这是通过认证的必要物理要求,那么您可以证明两台机器通过特定网络连接,并且仅打开特定端口等。

    持久性是队列软件的共同特征,传输层安全性也是如此。

    速度是一个比较模糊的问题。一般来说,队列系统中的消息,无论是商业的还是开源的(不管是自己滚动的)都只需几毫秒就可以传输并具有持久性等 - 增加了一些额外的加密开销。假设您的消息粒度正确(即它们不是“太小”并且协议不是“太健谈”),那么您应该做得很好。

    有许多商业和开源的消息和队列系统,谷歌是你找到它们的好朋友。

    一种左字段替代方案是使用现代的类似 REST 的架构。最好的充实示例之一是DayTrader

    祝你好运

    【讨论】:

    • 感谢您的意见,以及对 DayTrader 的引用 - 看起来我可以深入研究以了解如何完成工作。
    猜你喜欢
    • 2011-06-30
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多