我有一个在AWS EC2上运行的3个ElasticSearch节点的集群.这些节点使用OpsWorks/Chef进行设置.我的目的是将此集群设计为非常有弹性和弹性(节点可以在需要时进出).
从我读过的关于ElasticSearch的所有内容来看,似乎没有人建议在集群前放置负载均衡器; 相反,似乎建议做两件事之一:
将客户端指向一个节点的URL/IP,让ES为您执行负载平衡,并希望该节点永远不会出现故障.
将所有节点的URL/IP硬编码到客户端应用程序中,让应用程序处理故障转移逻辑.
我的背景主要是在Web场中,创建大量自治Web服务器,在其前面抛出ELB并让负载均衡器确定哪些节点存活或死亡,这是常识.为什么ES似乎不支持这种相同的架构?
我将所有现有的Azure In-Role缓存使用移至Redis,并决定将Azure Redis预览与StackExchange.Redis库(https://github.com/StackExchange/StackExchange.Redis)一起使用.我为它编写了所有代码没有太多问题,但是在运行时它绝对非常慢并且不断抛出超时错误(我的超时时间设置为15秒).
以下是我如何设置Redis连接并将其用于简单操作的相关代码:
private static ConnectionMultiplexer _cacheService;
private static IDatabase _database;
private static object _lock = new object();
private void Initialize()
{
if (_cacheService == null)
{
lock (_lock)
{
if (_cacheService == null)
{
var options = new ConfigurationOptions();
options.EndPoints.Add("{my url}", 6380);
options.Ssl = true;
options.Password = "my password";
// needed for FLUSHDB command
options.AllowAdmin = true;
// necessary?
options.KeepAlive = 30;
options.ConnectTimeout = 15000;
options.SyncTimeout = 15000;
int database = 0;
_cacheService = ConnectionMultiplexer.Connect(options);
_database …Run Code Online (Sandbox Code Playgroud) 我有一个ASP.NET Web API项目,ApiController它为User端点提供以下操作:
GET /api/User
POST /api/User
DELETE /api/user
Run Code Online (Sandbox Code Playgroud)
我想提供以下端点:
GET /api/user/metrics
Run Code Online (Sandbox Code Playgroud)
但是,当我像这样定义控制器动作时:
[HttpGet]
public HttpResponseMessage Metrics()
{
return null;
}
Run Code Online (Sandbox Code Playgroud)
我收到Multiple actions were found that match the request错误消息.
我理解这违反了"纯"REST API的定义,但这就是我想要做的.我想我必须通过映射HTTP路由来解决这个问题,但是我尝试了一些路由而且我无法让它工作.我的路线应该是什么样的?
我有一个Web API操作,如下所示:
[HttpGet]
[Route("api/query/hello/{query}")]
public HttpResponseMessage Hello([FromUri]Query query)
{
return null;
}
Run Code Online (Sandbox Code Playgroud)
其中Query类具有名为的公共字符串属性QueryText.当我点击以下网址时,收到404错误:
/api/query/hello?QueryText=bacon
Run Code Online (Sandbox Code Playgroud)
这在我开始使用属性路由之前有效.如果我没有参数或基本类型参数,我可以使属性路由工作.但是对于复杂的参数,我得到了404s.属性路由如何使用复杂的操作参数?它与FromUri属性兼容吗?
我将我的ASP.NET MVC应用程序切换为使用Newtonsoft JsonSerializer来执行我们的JSON序列化,如下所示:
var writer = new JsonTextWriter(HttpContext.Response.Output) { Formatting = Formatting };
var serializer = JsonSerializer.Create();
serializer.Serialize(writer, myData);
Run Code Online (Sandbox Code Playgroud)
这会生成一些具有$ id和$ ref属性的JSON,然后从JSON中删除重复的对象.我知道这是一个很棒的功能,但是阅读这个JSON的客户端不能支持解释这些引用并期望完整的对象存在.我已经尝试将PreserveReferencesHandling属性设置JsonSerializerSettings为每个可能的值,它似乎没有任何区别.
如何禁用$ id和$ ref属性的创建,并让Newtonsoft序列化器写出整个对象图?
编辑:这是一个示例C#类,我期望的JSON,以及由Newtonsoft序列化程序创建的JSON:
public class Product
{
public Image MainImage { get; set; }
public List<Image> AllImages { get; set; }
}
public class Image
{
public int Id { get; set; }
public string Url { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我希望JSON:
{
MainImage: { Id: 1, Url: 'http://contoso.com/product.png' },
AllImages: [{ …Run Code Online (Sandbox Code Playgroud) 我需要在ASP.NET MVC 4应用程序中创建特定文件的绝对URL.我目前正在通过生成相对路径Url.Content,然后使用以下扩展方法来创建绝对路径.
public static string Absolute(this UrlHelper url, string relativeUrl)
{
var request = url.RequestContext.HttpContext.Request;
return string.Format("{0}://{1}{2}{3}",
(request.IsSecureConnection) ? "https" : "http",
request.Url.Host,
(request.Url.Port == 80) ? "" : ":" + request.Url.Port,
VirtualPathUtility.ToAbsolute(relativeUrl));
}
Run Code Online (Sandbox Code Playgroud)
在Azure模拟器下运行时,我需要创建的正确URL是,http://127.0.0.1/myfile.jpg但是当执行此代码时,端口号将返回81,因此生成的URL为http://127:0.0.1:81/myfile.jpg.但是,如果我去http://127:0.0.1:81/myfile.jpg它当然不起作用,因为Azure模拟器正在侦听端口80,而不是81.
我假设这与内置的Azure Emulator/IIS Express负载均衡器有关,但我不确定我需要对我的Url.Absolute方法做出哪些更改才能返回准确的URL.
我开发了一个JavaScript插件,可以包含在我们客户的网站上.我创建的插件依赖于一些外部库,它们被捆绑并作为一个大包传递给客户端:jQuery 1.8.2和KnockoutJS v3.0.0.
该插件在大多数站点上都可以正常运行,但如果主机站点使用RequireJS,则我的包无法加载,因为KnockoutJS会自动检测到RequireJS存在并尝试使用它.这是抛出的错误:
Mismatched anonymous define() module
Run Code Online (Sandbox Code Playgroud)
显然,我在RequireJS网站上找到了错误消息的"解释".不幸的是,我不明白如何避免它.在我的KnockoutJS库的本地副本中,我发现了违规行:
(function(factory) {
// Support three module loading scenarios
if (typeof require === 'function' && typeof exports === 'object' && typeof module === 'object') {
// [1] CommonJS/Node.js
var target = module['exports'] || exports; // module.exports is for Node.js
factory(target);
} else if (typeof define === 'function' && define['amd']) {
// [2] AMD anonymous module
define(['exports'], factory);
} else {
// [3] No module loader (plain <script> tag) - put directly in …Run Code Online (Sandbox Code Playgroud) c# ×5
asp.net ×4
asp.net-mvc ×2
azure ×2
amazon-ec2 ×1
caching ×1
javascript ×1
jquery ×1
json ×1
json.net ×1
knockout.js ×1
lucene ×1
nosql ×1
redis ×1
requirejs ×1
rest ×1