我可以为SSIS跨进程通信提供哪些选项?

3
我想存储一个整数变量,用于增加和减少(限制对外部API的并发请求的计数信号量)。这很容易,但是我需要一种方法从运行在并行SQL代理作业中的SSIS包中读取/写入此变量。现在,可以同时运行0到5个SQL代理作业实例,因此也可以运行相应数量的SSIS包。
有哪些选项可供我读写此变量?将使用该变量的代码编写为.NET中的自定义SSIS任务。
确切的值并不是特别重要,只要它大致接近就在公差范围内。确切的值很好,但不是必需的。
我可以访问文件系统、注册表、数据库、服务器和整个SSIS代理,但我想通过15-30个线程频繁检查此变量,这在历史上使用文件系统方法引起了问题(我可能做错了),而且在我的看法中,存储在数据库中太过密集。请纠正我如果我错了。将其存储在注册表中将防止跨服务器群访问该变量。
如果有人可以帮忙,我将很乐意成为您的契约仆人。

4
请问,这个值为什么不能存储在数据库表中?所有5个实例都应该能够读取它,如果适用的话,您需要使用适当的锁定,或者我可能过于简化了您的问题?当您需要获取或更新该值时,您可以通过SqlClient在自定义任务中的代码中进行操作。 - Ta01
主要原因就是我与数据库的交互量太大了。我上面的概述有些简化,因为这5个实例中的每一个都可以有多达20个线程在循环中访问该变量,等待该变量低于某个阈值。最坏情况下,假设我将线程睡眠一秒钟,那么每秒会产生约100个查询。现在它们正在等待本地进程变量,睡眠时间为100毫秒。希望这能帮到你。 - Jordan
2个回答

2
如果它被用作计数信号量,为什么不直接使用Windows信号量对象呢?System.Threading.Semaphore是.NET版本的信号量对象,如果在构造函数中指定信号量名称,则Win32对象将在使用此名称的所有进程之间共享。

你真是太棒了。感谢提供这些信息——要是我几个月前就知道这门课程就好了。不知为何在搜索时从未出现过。回到工作岗位后,我会尝试一下这门课程。 - Jordan

0

我不确定我理解这个问题 - 你说你可以访问数据库、文件系统、注册表等,你是在说你不想/不能使用这些方法吗?你是想将值持久化,以便在计算机停止运行时可以恢复吗?

如果不需要持久性,可以通过RPC(包括COM或Web服务)在内存中保留。无论采用什么解决方案,似乎都需要是全局的,并且对所有正在运行的实例可见。

这个变量元数据是用作控制和协调进程的信号量,还是这个变量域数据?


我正在寻求关于如何使用上述任何方法或我不知道的其他可用方法来控制对此变量的访问的输入。它确实是一个计数信号量,用于协调对外部API的并发请求数量。持久性不是必需的,因为我有一个排队系统,如果出现故障,它将从停止的地方继续执行。 - Jordan
有很多概念需要考虑。外部进程是否使用多个线程运行,或者多个外部进程实例各自使用单个线程运行?如果外部进程包含多个线程(并且假设此外部进程是可变的),则可以添加计数器来计算线程数,并在外部进程中包含适当的接口以检索计数。如果外部进程不是多线程的,而是具有单个线程和多个实例,则使用进程计数将提供这些详细信息。 - barrypicker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接