【发布时间】:2016-04-01 20:18:16
【问题描述】:
我正在尝试使用Go pubsub library 来对抗local emulated pubsub server。我发现“旧样式”(已弃用)函数(例如 CreateSub 和 PullWait)可以正常工作,但“新样式”API(例如 Iterators 和 SubscriptionHandles)无法按预期工作。
我编写了两个不同的单元测试,它们都测试相同的动作序列,一个使用“新风格”API,一个使用“旧风格”API。
顺序是:
- 创建订阅
- 无法提取任何消息(因为没有可用消息)
- 发布消息
- 提取该消息,但不确认它
- 最后再拉一次,这需要 10 秒,因为消息 ACK 超时必须先过期
https://gist.github.com/ianrose14/db6ecd9ccb6c84c8b36bf49d93b11bfb
使用旧式 API 的测试正如我所料:
=== RUN TestPubSubRereadLegacyForDemo
--- PASS: TestPubSubRereadLegacyForDemo (10.32s)
pubsubintg_test.go:217: PullWait returned in 21.64236ms (expected 0)
pubsubintg_test.go:228: PullWait returned in 10.048119558s (expected 10s)
PASS
而使用新式 API 的测试工作不可靠。有时事情会按预期工作:
=== RUN TestPubSubRereadForDemo
--- PASS: TestPubSubRereadForDemo (11.38s)
pubsubintg_test.go:149: iter.Next() returned in 17.686701ms (expected 0)
pubsubintg_test.go:171: iter.Next() returned in 10.059492646s (expected 10s)
PASS
但有时我发现iter.Stop() 并没有按应有的方式及时返回(并注意第二个 iter.Next 比它应该的时间长得多):
=== RUN TestPubSubRereadForDemo
--- FAIL: TestPubSubRereadForDemo (23.87s)
pubsubintg_test.go:149: iter.Next() returned in 7.3284ms (expected 0)
pubsubintg_test.go:171: iter.Next() returned in 20.074994835s (expected 10s)
pubsubintg_test.go:183: iter.Stop() took too long (2.475055901s)
FAIL
而其他时候我发现发布消息后的第一次拉取时间太长(应该接近即时):
=== RUN TestPubSubRereadForDemo
--- FAIL: TestPubSubRereadForDemo (6.32s)
pubsubintg_test.go:147: failed to pull message from iterator: context deadline exceeded
FAIL
有什么想法吗?是否有任何使用新型 API 的工作示例?不幸的是,Go starter project here 使用的是旧的、已弃用的 API。
【问题讨论】: