我正在开发一个与Facebook相似的应用程序。我目前正在调用Facebook的Graph API,但我发现如果我在600秒内调用它超过600次,那么我将在接下来的15分钟内暂停。
我的问题是,我该如何处理?我有查询结果缓存每个页面计数一分钟,但如果我有超过600页,我想显示所有600多个页面的喜欢我仍然可以超过速率限制。我该如何解决这个问题?
我正在考虑创建一个Windows服务,每隔x秒查询一次Facebook,并在我自己的数据库中存储最新的值。然后我使用我的数据库来查询最新的值。但我觉得必须有一种更简单或更好的方法来解决这个问题吗?
我查看了实时更新(https://developers.facebook.com/docs/graph-api/real-time-updates/v2.1),但我担心我们的服务器将无法处理来自Facebook的来电,我的理解是我仍然需要致电Facebook来获取实际情况喜欢/分享计数。
public async Task<List<KeyValuePair<string, int>>> GetTopTen()
{
Dictionary<string, int> pageVotes = new Dictionary<string, int>();
List<string> pageIds = await GetAllPageIds();
foreach(string pid in pageIds)
{
pageVotes[pid] = await GetLikes(pid);
}
return pageVotes.OrderByDescending(x => x.Value).Take(10).ToList();
}
private async Task<int> GetLikes(string pageId)
{
string thisCacheKey = "GetProfileVotes_" + GetUniqueCacheKey(pageId);
ObjectCache cache = MemoryCache.Default;
int? result = cache[thisCacheKey] as int?;
if (result == null)
{
string websiteURL = ConfigurationManager.AppSettings["WebsiteURL"];
string url = Path.Combine(websiteURL, "Page", pageId);
try
{
string jsonString = await new WebClient().DownloadStringTaskAsync("http://graph.facebook.com/" + url);
JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> results = (Dictionary<string, object>)serializer.Deserialize<object>(jsonString);
object idValue = "";
object likeValue = "";
bool success = results.TryGetValue("id", out idValue);
bool likes = results.TryGetValue("shares", out likeValue);
if (success)
{
if (likes)
result = (int)likeValue;
else
result = 0; // Facebook returns null "shares" for 0 votes
// Save the last successful pull
SaveLastFacebookLikeCount(pageId, result.Value);
}
else
{
result = -1;
}
}
catch(Exception ex)
{
result = -1;
}
if(result < 0)
{
result = GetLastFacebookLikeCount(pageId);
}
CacheItemPolicy policy = new CacheItemPolicy();
policy.AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(60);
cache.Set(thisCacheKey, result, policy);
}
return result.Value;
}
答案 0 :(得分:0)
费率限制详情&amp;上个月公开记录了数字:
https://developers.facebook.com/docs/graph-api/advanced/rate-limiting
虽然这不是您问题的直接答案,但它可能会为您提供指导和帮助。关于如何围绕这些建立的确切数字。