【发布时间】:2016-12-05 06:42:10
【问题描述】:
我需要通过我系统中的所有用户创建 Web API 搜索功能。 客户端(使用电话)使用端点向我发送请求:
HTTP 1.1 GET http://sf.cluster:80/
Path /search/users?q=Aa&take=10
其中 q 是用户在搜索字段中输入的字符串。 take - 手机想要显示多少条目。
我在我的可靠字典中上传了 Azure 存储表中的 89000 个项目。它有结构:
IReliableDictionary<Guid, string>
我的搜索方法如下:
public async Task<IEnumerable<UserInfo>> Search(string q, int take)
{
var usersDictionary = await GetUsersDictionary();
IEnumerable<UserInfo> results;
using (var tx = StateManager.CreateTransaction())
{
var searchResults = (from r in (await usersDictionary.CreateEnumerableAsync(tx)).ToEnumerable()
where r.Value.StartsWith(q, StringComparison.InvariantCultureIgnoreCase)
select new UserInfo()
{
Id = r.Key,
Name = r.Value
}).Take(take);
results = new List<UserInfo>(searchResults);
await tx.CommitAsync();
}
return results;
}
问题:它在手机上运行良好,我得到了我的预期。但是当我开始用一堆请求推送我的端点时(大约 60 个线程同时使用Soap UI 工具),开始的超时从 1 秒增加到 35 秒!看来我在某个地方犯了错误,或者选择了错误的搜索实现方式。
有人实现了这样的功能吗?任何人都可以帮助正确的搜索方法吗?
UPD: 实现了无状态服务,我将 List<string> 与名称一起存储并执行相同的操作(通过列表搜索)。结果:150-300 毫秒。看起来我应该将 List 存储在一个状态中(在有状态服务中)并根据请求获取它..
【问题讨论】:
标签: search azure-service-fabric