AMQP.Net 信用卡似乎没有按预期工作
AMQP.Net Credit doesn't seem to work as expected
我无法完全理解与 AMQP.Net 一起使用的“信用”属性。它的读取方式似乎可以用来防止发送方排队太多数据。如果我将积分设置为较低的值,当积分用完时,“ResponseLink.Closed”事件会触发并且进程停止。我想做的是设置一个信用点,这样当接收者不堪重负时,发送者可以暂停让接收者稍微赶上,然后从它停止的地方再次开始发送。目前,发送方排队的数据太多,导致计算机内存不足,因为接收方速度 运行 慢。这是否可以通过使用信用或是否需要使用替代解决方案来实现?
更新
我现在使用的方式 AMQP.Net 是客户端调用服务器请求发送某种类型的数据。服务器调用数据库并返回一个非常大的数据列表。然后使用以下方法从 foreach 循环将此数据发送到客户端:
requestContext.Complete( ** an item of data goes in here **)
客户端通过其末尾的 OnMessage 事件获取这些信息。由于发送速度快于客户端可以处理的速度,因此内存使用量增长很快。如何在服务器端获得一些反馈以了解客户端何时处理了 n 条消息,以便它可以在发送更多消息之前暂停?
此更新更好地描述了您如何使用该库以及您 运行 遇到的问题。根据请求消息中的内容,您可以尝试两种解决方案。
如果客户端请求总是有大量数据,您可以切换为使用来自客户端的单个接收器 link。在侦听器端,您注册一个 link 处理器 (ILinkProcessor) 并在收到 link 附加请求时创建一个 SourceLinkEndpoint。您可以在创建 link 时在 attach.properties 中传递请求特定数据。您还需要实现 IMessageSource 接口。该库将在流程和确认事件上调用您的方法实现。在 GetMessageAsync 方法中,您可以查询数据库以获取仅适合一条消息的数据,或用于填充 in-memory 缓存的项目列表,从中提供 GetMessageAsync 调用。传输所有数据后关闭 link。在此模型中,AMQP link 流量控制将在消息传输中进行,您可以完全控制 link.
可以使用多少内存
如果您更喜欢request/response模型,您需要实现一些分页逻辑以避免监听端的高内存消耗。 request/response 模式建立在使用一对 link 的标准 AMQP 消息传输之上。一个 link 中的流控制独立于另一个,不能用于协调请求和响应消息的传输。您可以更频繁地发送请求并仅向每个请求提供 fixed-size(或数量)的消息,而不是将所有数据提供给一个客户端请求。
我无法完全理解与 AMQP.Net 一起使用的“信用”属性。它的读取方式似乎可以用来防止发送方排队太多数据。如果我将积分设置为较低的值,当积分用完时,“ResponseLink.Closed”事件会触发并且进程停止。我想做的是设置一个信用点,这样当接收者不堪重负时,发送者可以暂停让接收者稍微赶上,然后从它停止的地方再次开始发送。目前,发送方排队的数据太多,导致计算机内存不足,因为接收方速度 运行 慢。这是否可以通过使用信用或是否需要使用替代解决方案来实现?
更新
我现在使用的方式 AMQP.Net 是客户端调用服务器请求发送某种类型的数据。服务器调用数据库并返回一个非常大的数据列表。然后使用以下方法从 foreach 循环将此数据发送到客户端:
requestContext.Complete( ** an item of data goes in here **)
客户端通过其末尾的 OnMessage 事件获取这些信息。由于发送速度快于客户端可以处理的速度,因此内存使用量增长很快。如何在服务器端获得一些反馈以了解客户端何时处理了 n 条消息,以便它可以在发送更多消息之前暂停?
此更新更好地描述了您如何使用该库以及您 运行 遇到的问题。根据请求消息中的内容,您可以尝试两种解决方案。
如果客户端请求总是有大量数据,您可以切换为使用来自客户端的单个接收器 link。在侦听器端,您注册一个 link 处理器 (ILinkProcessor) 并在收到 link 附加请求时创建一个 SourceLinkEndpoint。您可以在创建 link 时在 attach.properties 中传递请求特定数据。您还需要实现 IMessageSource 接口。该库将在流程和确认事件上调用您的方法实现。在 GetMessageAsync 方法中,您可以查询数据库以获取仅适合一条消息的数据,或用于填充 in-memory 缓存的项目列表,从中提供 GetMessageAsync 调用。传输所有数据后关闭 link。在此模型中,AMQP link 流量控制将在消息传输中进行,您可以完全控制 link.
可以使用多少内存
如果您更喜欢request/response模型,您需要实现一些分页逻辑以避免监听端的高内存消耗。 request/response 模式建立在使用一对 link 的标准 AMQP 消息传输之上。一个 link 中的流控制独立于另一个,不能用于协调请求和响应消息的传输。您可以更频繁地发送请求并仅向每个请求提供 fixed-size(或数量)的消息,而不是将所有数据提供给一个客户端请求。