C# 数据的异步处理
此时,我正在尝试组合一个异步tcp服务器来接收数据,然后我要处理这些数据,提取值并插入sql server 我认为最好的基本概念是,一旦数据被接收并确认为整个消息,消息就应该被传递到某种类型的集合,等待FIFO处理,FIFO将解析值并将其插入sql server。我想这就是所谓的消费者/生产者模式 我一直在研究最好的收集方法,到目前为止,我已经看到了使用async/await的BlockingCollection、ConcurrentCollection和BufferBlock,我认为这可能是最好的方法,但老实说,我不确定 我找到的最好的例子是斯蒂芬·克利里的博客,特别是这篇文章, 我的主要保留意见是,我决不想减慢或中断信息的接收,我认为这会建议使用多个生产者/消费者示例,可以在上面的链接中看到,但我想知道的是C# 数据的异步处理,c#,.net,collections,task-parallel-library,async-await,C#,.net,Collections,Task Parallel Library,Async Await,此时,我正在尝试组合一个异步tcp服务器来接收数据,然后我要处理这些数据,提取值并插入sql server 我认为最好的基本概念是,一旦数据被接收并确认为整个消息,消息就应该被传递到某种类型的集合,等待FIFO处理,FIFO将解析值并将其插入sql server。我想这就是所谓的消费者/生产者模式 我一直在研究最好的收集方法,到目前为止,我已经看到了使用async/await的BlockingCollection、ConcurrentCollection和BufferBlock,我认为这可能是最
- 我的假设是否正确,或者在我的场景中是否有更合适的方法来实现这一点
- 如果我的假设是正确的,考虑到我的用例,有人能建议实现这个的最佳方法吗
另一方面,如果可以接受丢失消息,则可以将其保留在内存中。只有在这种情况下,您才能使用我的博客中提到的内存生产者/消费者类型之一。这是一种非常罕见的情况,但它确实时常发生。一般来说,我会避免使用BlockingCollection和friends进行此类工作。这样做会鼓励您将整个系统构建到单个流程中,这是可伸缩性和可靠性的敌人 我建议使用进程外队列来管理工作。我不同意这必然会使体系结构复杂化,但事实上,我认为它可以使事情变得简单一些。具体来说,原始需求的一个主要复杂性(“组装一个异步tcp服务器”)消失了。异步TCP服务器是一个很难写的东西,而且很容易出错——为什么不干脆跳过这一部分,把所有精力都放在后处理代码上呢 当我构建这样一个系统时,我使用了一个队列作为任务队列。任务被序列化为JSON,客户端将使用命令将其任务添加到队列中。工作进程从队列中检索下一个任务,完成自己的工作,然后返回等待下一个任务 优点:
- 没有锁。所有同步都是从Redis(或您选择的任何任务队列)免费提供的
- 系统中的所有内容都是单线程的。多线程是很难的
- 我可以自由地启动任意多个工作进程,跨越任意多个节点