我需要通過我的系統中的所有用戶創建Web API搜索功能。 客戶端(使用電話)給我發請求使用端點:通過可靠的字典搜索
HTTP 1.1 GET http://sf.cluster:80/
Path /search/users?q=Aa&take=10
凡q是在搜索字段中輸入一個字符串用戶。 以 - 手機要顯示多少條目。
我上傳到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;
}
問題:它可以在手機上很好,我得到了我的預期。但是當我開始用一堆請求開始推送我的端點時(使用Soap UI工具同時約使用大約60個線程),超時開始時間從1秒增加到35秒!看起來我在某個地方犯了一個錯誤,或者選擇了一種錯誤的搜索實現方式。
有人實現了這樣的功能嗎?任何人都可以使用正確的搜索方法嗎?
UPD:實現無狀態服務,其中存儲名稱爲List<string>
,並執行相同的操作(通過列表搜索)。結果:150-300ms。它看起來像我應該存儲列表狀態(在有狀態服務),並得到它的要求..