所以场景是我使用SB队列来限制对其他服务的传出回调.回拨给其他服务的标准问题之一是它们可能会因无法控制的时间而停机.假设我检测到目标已关闭/没有响应,放弃该消息的最佳模式是什么,以便它不会立即重新出现在队列中?
以下是我要么意识到的,尝试过或正在考虑的一些方法:
显然,如果我只是使用BrokeredMessage::Abandon()
该消息将被解锁并重新放回队列.对于这种情况以及我想要避免的情况,这显然是不可取的.
如果我只是忽略了我遇到错误并且从不调用Abandon的事实,这将使它不会立即出现,但我真的没有细致的控制,直到它再次显示多久,我想实现一个腐朽的重试策略.
我想也许我可以调用BrokeredMessage::Abandon(IDictionary<string, object>)
并以某种方式更新ScheduledEnqueueTimeUTC
属性,但我已经尝试了这个并且除了最初发送消息之外似乎没有办法影响该属性.有道理,但值得一试.
我考虑过只是BrokeredMessage::Complete()
在这种情况下使用,实际上只是用属性集将消息的新副本排入队列ScheduledEqueueTimeUTC
.
最后的子弹几乎看起来太过沉重,但我得出结论,考虑到队列的固有性质,它可能是正确的答案.我只想到在Azure SB队列中可能有一个更好的方法来实现这一点,我很想念.
因此,如果我正在为另一个库中的类型编写扩展方法,将该类型转换为Rx IObservable<T>
,那么约定究竟是什么?我问,因为我认为AsObservable
是要走的路,但我也看到了ToObservable
.我不清楚在何时或是否有任何真正的惯例时使用哪个.
难道是ToObservable
被保留用于车削东西预计产品单一事件到IObservable<T>
为其中AsObservable
保留用于转换的东西,预计将产生的一系列事件到IObervable<T>
?
我在 sdk V4 Bot 中实现了一个中间件来拦截 bot 和用户之间的每条消息并记录该自定义 mongo Db。我正在尝试为使用 SDK v4 构建的 Bot 实现类似的概念。看起来我可以使用以下代码添加中间件,但是不确定如何区分机器人到用户和用户到机器人之间的消息。
V3 机器人代码
bot.use({
botbuilder: function (session, next) {
logUserConversation(session)
next()
},
send: function (event, next) {
logBotsConversation(event)
next()
}
})
Run Code Online (Sandbox Code Playgroud)
中间件的 V4 bot 代码
botAdapter.use(async (turnContext, next) => {
// How to find which messages/activity object is from user to bot
await next();
// How to find which messages/activity object is from bot to user.
});
Run Code Online (Sandbox Code Playgroud) 基本上,我想要处理多个线程中的项目列表,而不是一次处理一个.我一次只想要有限数量的线程.这种方法有意义吗?使用全局变量进行线程计数是唯一的选择吗?(下面的伪代码)
foreach item in list
while thread_count >= thread_max
sleep
loop
start_thread item
thread_count++
next
function start_thread(item)
do_something_to item
thread_count--
end function
Run Code Online (Sandbox Code Playgroud)