【问题标题】:Considerations for building Multithread Aggregator with database connectivity使用数据库连接构建多线程聚合器的注意事项
【发布时间】:2014-09-06 15:48:07
【问题描述】:

我有兴趣构建一个 c# 控制台应用程序,该应用程序将连接到 Twitter 的公共流 API 并将推文保存到 MSSQL 数据库。我想看看是否有人不介意确认我是否正确地处理了这个问题。

我设想流式 API 连接在其自己的线程上异步运行。当收到一条推文时,我想根据业务逻辑(附加线程)处理它并假定有效,将其添加到最终将持久保存到数据库并清除的推文队列(列表)中。这是应用程序的 3 个线程

  • 后台工作人员监听流的新推文
  • 后台工作人员根据业务逻辑处理推文并添加到推文队列
  • 后台工作人员负责每隔 N 秒保存一次队列,然后清空队列

我相信 tweet-queue 变量需要是静态的和线程安全的。也许数据库连接和流对象也是如此?我很确定在访问时我必须锁定线程安全变量,我需要担心死锁吗?还有其他我遗漏的注意事项吗?

提前感谢您的帮助和见解

【问题讨论】:

  • 我会为每一步使用一个队列。我怀疑您应该使用更多线程来收听 Twitter API,但我不知道。至少您应该将结果放入队列并重新开始收听。在下一个线程上,您可以进行评估并将其存储到数据库中。如果你真的需要,你仍然可以把它放在一个新的队列中并从另一个线程存储它。
  • 感谢您的建议。使用 MS 的原生队列集合,我在添加/删除项目时是否仍需要手动锁定队列对象,还是由 MS 自动处理?
  • 这个问题似乎是题外话,因为它应该在Programmers StackExchange

标签: c# database multithreading


【解决方案1】:

就我而言,我不会从头开始构建排队系统,因为市场上有很多免费或非常便宜的选择。

一个线程将监听推文并将其排入持久队列解决方案。其他或许多线程将订阅推文队列,以使用您的域层将推文存储到您自己的数据库存储中。

由于您是 .NET 开发人员,I would check Microsoft Azure's Service Bus service,因为它是一个理想的解决方案,因为它支持生产者/消费者模式甚至传统队列,并且在主题(生产者/消费者)的情况下,您拥有完整的事务性消息传递系统,可能会将您的解决方案转变为可靠的基础架构。

此外,您应该期待实现 Windows 服务而不是控制台应用程序。 Check TopShelf,一个开源框架,可以轻松开发 Windows 服务。

【讨论】:

    猜你喜欢
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    • 2012-01-15
    • 2015-09-12
    • 1970-01-01
    相关资源
    最近更新 更多