对于 SSIS 跨进程通信,我都有哪些选择?
Posted
技术标签:
【中文标题】对于 SSIS 跨进程通信,我都有哪些选择?【英文标题】:What options do I have for SSIS cross-process communication?对于 SSIS 跨进程通信,我有哪些选择? 【发布时间】:2011-03-03 16:30:13 【问题描述】:我想存储一个递增和递减的整数变量(用于限制对外部 API 的并发请求的计数信号量)。这很容易,除非我需要一种方法从在并行 SQL 代理作业中运行的 SSIS 包中读取/写入此变量。现在可以有 0 到 5 个 SQL 代理作业实例,因此 SSIS 包同时运行。
我有哪些读取和写入此变量的选项?将使用此变量的代码在 .NET 中编写为自定义 SSIS 任务。
该值是否完全正确并不特别重要,只要它通常接近我在公差范围内。精确会很好,但不是必需的。
我可以访问整个文件系统、注册表、数据库、服务器和 SSIS 代理,但我想经常使用 15-30 个线程检查这个变量,这在历史上会导致使用文件出现问题系统方法(我可能做错了),并且 IMO 过于密集而无法存储在数据库中。如我错了请纠正我。存储在注册表中可防止变量在服务器场中被访问。
如果有人可以提供帮助,我很乐意成为您的契约仆人。
【问题讨论】:
只是想知道,这个值为什么不能存在于数据库表中?所有 5 个实例都应该能够读取它,如果适用,您必须使用适当的锁定,或者我可能过度简化您的问题?当您需要获取或更新值时,您可以通过 SqlClient 自定义任务中的代码来完成。 主要原因只是我正在与数据库交谈的数量。我上面的概述有些简化,因为这 5 个实例中的每一个都可以有多达 20 个线程,所有线程都在一个循环中访问该变量,等待该变量低于某个阈值。最坏的情况是每秒大约 100 个查询,假设我让线程休眠一整秒。现在他们正在休眠 100 毫秒等待本地进程变量。希望这会有所帮助。 【参考方案1】:如果用作计数信号量,为什么不实际使用 Windows 信号量对象呢? System.Threading.Semaphore 是它的 .NET 版本,如果您在构造函数中指定信号量名称 - Win32 对象将在使用此名称的所有进程之间共享。
【讨论】:
你就是那个男人。感谢您提供的信息——我希望几个月前我能知道这门课。由于某种原因,它在搜索过程中从未出现过。当我回到工作岗位时,我会试一试。【参考方案2】:不确定我是否理解这个问题 - 您表示您可以访问数据库、文件系统、注册表等。您是说您不想/不能使用这些方法吗?您是否希望保留该值,以便在计算机停止运行时可以恢复?
如果不需要持久性,您可以通过 RPC(包括 COM 或 Web 服务)在内存中持久化。无论采用何种解决方案,它似乎都需要是全局的并且对所有正在运行的实例都是可见的。
这个变量元数据是用作信号量来控制和协调流程,还是这个变量域数据?
【讨论】:
我正在寻找有关如何使用上述任何方法的输入,或者任何我不知道的可用于控制对该变量的访问的输入。它确实是一个计数信号量,用于协调对外部 API 的并发请求数。不需要持久性,因为我有一个排队系统,如果出现故障,它会从中断的地方继续。 有很多概念需要考虑。外部进程是否使用多个线程进行操作,或者外部进程的多个实例是否都使用单个线程进行操作?如果外部进程包含多个线程(并假设此外部进程是可变的),您可以添加一个计数器来计算线程数,在外部进程中包含一个适当的接口来检索计数。如果外部进程不是多线程的,而是具有单线程的,具有多个实例的进程计数的使用将提供这些详细信息。以上是关于对于 SSIS 跨进程通信,我都有哪些选择?的主要内容,如果未能解决你的问题,请参考以下文章