我一直在寻找关于Azure联合数据库的id生成(针对联合/主键)的最佳实践的一些文章或指南,并且没有发现任何引人注目的内容.联合表不支持标识列,因此在我看来,唯一实用的id类型是GUID,因为尝试集中创建和使用BigInt会在应用程序中创建单点故障.我主要担心的是使用GUID而不是BigInts的性能影响(特别是对表的索引).
是否有任何建议/最佳实践(或现有库)为分布式系统创建唯一的BigInts(或者我不应该担心使用GUID的性能影响吗?).
[更新]
自从发布问题以来已经阅读了很多关于此的内容,在我看来,密钥生成将成为Azure中的一个问题.根据Microsoft 的此博客文章,建议将GUID用作联合密钥.但是,他们没有提到Federated表上的所有索引(包括聚簇索引)都必须包含联合密钥.这意味着所有这些索引都将包含GUID,这将破坏插入性能.
替代方案似乎是使用中心密钥生成服务(如下面Simon所述),它在潜在的瓶颈和中心故障点方面有其自身的缺点.
我原本以为微软会对此提出更多指导,因为这是每个创建联合表的人都会遇到的问题!
总的来说,我已经决定采用中心密钥生成服务,但它确实让我感到担心.如果有人有一些神奇的技巧,我很乐意听到它(或者让我知道,如果我错过了一些明显的东西)!
我使用Lucene.net索引产品目录.我使用ANTS Profiler分析我的搜索,我注意到使用MultiFieldQueryParser创建和解析查询的行为几乎与实际搜索一样长(大约100ms).然后我尝试手动创建查询,这种情况发生得非常快(约1毫秒).我宁愿不必手动解析,虽然它确实给了我相同的结果集,我担心我可能不会处理某些用例或输入(虽然输入来自网站上的文本搜索,用户不会知道关于Lucene的搜索语法的任何内容).我的代码(使用两种方法)如下:
IApplicationSettings settings = new ApplicationSettingService();
FSDirectory directory = FSDirectory.Open(new DirectoryInfo(settings.GetSetting<string>("LuceneMainSearchDirectory")));
RAMDirectory ramDir = new RAMDirectory(directory);
_Searcher = new IndexSearcher(ramDir, true);
string[] searchFields = new string[] { "ProductName", "ProductLongDescription", "BrandName", "CategoryName" };
//Add a wildcard character to end of search to give broader results
if (!searchTerm.EndsWith(" ")) { searchTerm = searchTerm + "*"; }
//Use query parser...this block typically takes about 100ms on my machine, roughly 40% on the constructor and 60% on the call to Parse
MultiFieldQueryParser multiParser …Run Code Online (Sandbox Code Playgroud) 假设我有3个程序集,Example.Core,Example.Contracts,Example.WcfServices.在我的契约程序集中,我定义了一个接口并添加了一些操作,例如ICalculator,它具有Add(double a,double b)操作.在我的WcfServices程序集中,我将ICalculator实现为Wcf服务.
现在我的问题是这个......在我的Example.Core程序集中,如何在保持所有内容解耦的同时对该接口进行编程(以允许我有一个替代的接口实现).如果我有一个需要ICalculator的类,我可以创建一个来自ChannelFactory并使用它,或者我可以在构造函数中注入一个实例.如果我在课堂上创建一个,那么我在ChannelFactory/Wcf中将依赖项放在我的班级中,我真的不想这样做.如果我在构造函数中注入一个实例,那么注入类将如何管理和整理wcf服务?似乎虽然我有一个界面,但我没有干净的使用方法.我已经看过像NInject这样的东西了,但我不相信如果它出现故障会清理ChannelFactory(至少我没有发现任何文档显示它知道何时调用Abort而不是在通道上关闭).
我最终做的是再次实现我的界面并使用此问题中描述的方法:创建WCF ChannelFactory <T>并只调用服务上的方法.这对我来说有点"闻起来",因为我再次包裹所有的电话只是为了确保通道正确关闭/中止.
有没有任何模式/方法干净地有两个接口的实现,其中一个是Wcf服务?
谢谢,
麦克风.