2

我使用的平台具有使用 SQL 服务器表作为队列的消息传递系统。

该系统基于此: 使用表作为队列

ATM 我们面临一些可扩展性问题,因为这种分布式模式主要基于 SQL 锁和磁盘操作,以保证数据的持久性/一致性。

为了解决基于磁盘的 I/O 瓶颈并改善糟糕的分配逻辑,我们正在考虑将基于磁盘的 SQL 表更改为 SQL 2014 和 2016 中可用的内存 SQL (Hekaton)。

我已经阅读了一些关于 Hekaton 的内容,但我仍然不确定这是否是最好的方法,或者是否可以将这些队列实现到内存中以及这是否是最好的方法。

这些队列中的大多数都在实现悲观并发,而 Hekaton 使用无锁系统仅乐观并发(基于多版本)。“总是”(我知道这是一个坏词)有可能将悲观的并发变为乐观的并发吗?例如在上述队列中。

Hekaton 是否适用于许多插入/删除(入队/出队)、订单行(FIFO 队列)和大量表大小变化(服务器上的工作负载变化会增加/减少队列大小)?是否可以正确更新本机存储过程查询性能的统计信息?

我觉得本机编译的 SQL 存储过程会大大提高性能,但我不确定这种实现(相关的 FIFO 队列)是否适合在 Hekaton 上使用,因为我没有找到任何“在内存队列”使用 Hekaton 实现。

4

1 回答 1

2

您可以在 Hekaton 中实现您所描述的内容 - 正如您所提到的,如果事务由于同一行上的并发而中止,该应用程序将不得不重试。话虽如此,您还必须考虑 SQL 2014 不支持大型二进制对象,您将需要使用 SQL 2016 或解决它,就像我们为 ASP.NET 会话状态所做的那样:

http://blogs.msdn.com/b/kenkilty/archive/2014/07/03/asp-net-session-state-using-sql-sever-in-memory.aspx

Hekaton 是为 OLTP 设计的,这意味着大量的插入、更新、删除。

提前计划内存要求:

https://msdn.microsoft.com/en-us/library/dn133186.aspx

于 2015-11-12T17:52:21.383 回答