我一直在制作REST API已经有一段时间了,我仍然会遇到一个案例 - 大文件上传.我已经阅读了其他一些API,比如Google Drive,Twitter和其他文献,我有两个想法,但我不确定它们中的任何一个是"正确的".正如在适当的情况下,我的意思是它有点标准化,不需要太多的客户端逻辑(因为其他方将实现该客户端),或者甚至更好,它可以通过cURL轻松调用.计划是用Java实现它,最好是Play Framework.
显然,由于文件很大,我需要一些文件分区和服务器端缓冲机制.
所以,我得到的第一个解决方案是分段上传(multipart/form-data).我得到了这种方式,之前我已经实现了这一点,但实际上在客户端模拟表单总是很奇怪,特别是因为客户端必须设置文件密钥名称,根据我的经验,这是一些东西客户有点忘记或不理解.另外,块尺寸/零件尺寸是如何规定的?什么阻止客户端将整个文件放在一个块中?
解决方案二,至少我理解的,但没有找到实际的实现实现是"常规"POST请求可以工作.内容应该分块,数据在服务器端缓冲.但是,我不确定这是一个正确的理解.数据实际上是如何分块的,上传是跨越多个HTTP请求还是在TCP级别上进行分块?什么是Content-Type?
最重要的是,这两个(或其他什么?)应该是一个客户友好的,广泛可理解的实现REST API文件上传的方式?
我正在使用Akka开发一个应用程序,这个问题让我整个时间都认为消息声明是用Actor的.我应该在哪里声明消息?在接收器伴侣对象或发送者伴侣对象或第三位?
在试图深入了解 Kafka 分发模型时,StackOverflow 的一句话让我兴奋不已,我无法得到确认或否认。
因此,订阅者组越多,性能就越低,因为 kafka 需要将消息复制到所有这些组并保证总顺序。
据我从 Kafka 文档中了解到,多个消费者组的行为与单个消费者类似。代理内不会进行复制,因为每个消费者对于某个分区都有自己的偏移量。那么,组的数量不应产生任何显着的开销,所有数据都位于一个位置,只是偏移量不同。那是对的吗?
如果这是正确的,那么实际上无法在不影响吞吐量的情况下引入多个不相交的消费者,因为所有消费者总是查询所有分区,并且引入了某种复制。请注意,这与消费者线程的数量无关,线程只会提高消费者性能,据我所知,它们不会干扰代理操作。
message-queue publish-subscribe bigdata messagebroker apache-kafka
我正在使用Asp.net web api构建Web服务,我必须从AXIS IP Camera获取图像.但是,摄像机使用摘要式身份验证.所以我的C#代码看起来像这样:
WebClient webClient = new WebClient();
webClient.UseDefaultCredentials = true;
webClient.Credentials = new NetworkCredential("***", "***");
byte[] imageStream = webClient.DownloadData("http://192.168.0.90/axis-cgi/jpg/image.cgi");
Run Code Online (Sandbox Code Playgroud)
这一切都有效,但在查看Fiddler时,我发现客户端在没有身份验证的情况下发送了一个请求,并返回401错误.之后,它发送具有摘要安全性的那个.
我在这里找到了一个带有手动凭证注入的解决方案:
http://kristofmattei.be/2013/02/20/webclient-not-sending-credentials-heres-why/
但这看起来不错.它使用基本身份验证,我真的不想要,看起来有点不专业.
有没有办法立即发送签名的请求或这是如何工作的,因为我注意到相机在第一个请求中返回nonce?
我必须每个客户每秒存储大约250个数值,每小时大约900k个数字.它可能不会是一整天的录音(可能每天5-10个小时),但我会根据客户端ID和读取日期对数据进行分区.最大行长约为22-23M,仍然可以控制.毫无意义,我的计划看起来像这样:
CREATE TABLE measurement (
clientid text,
date text,
event_time timestamp,
value int,
PRIMARY KEY ((clientid,date), event_time)
);
Run Code Online (Sandbox Code Playgroud)
密钥空间的复制因子为2,仅用于测试,snitch是GossipingPropertyFileSnitch和NetworkTopologyStrategy.我知道复制因子3是更多的生产标准.
接下来,我在公司服务器上创建了一个小型集群,三个裸机虚拟化机器,具有2个CPU x 2核心和16GB RAM以及大量空间.我和他们在千兆局域网中.群集基于nodetool运行.
这是我用来测试我的设置的代码:
Cluster cluster = Cluster.builder()
.addContactPoint("192.168.1.100")
.addContactPoint("192.168.1.102")
.build();
Session session = cluster.connect();
DateTime time = DateTime.now();
BlockingQueue<BatchStatement> queryQueue = new ArrayBlockingQueue(50, true);
try {
ExecutorService pool = Executors.newFixedThreadPool(15); //changed the pool size also to throttle inserts
String insertQuery = "insert into keyspace.measurement (clientid,date,event_time,value) values (?, ?, ?, ?)";
PreparedStatement preparedStatement = session.prepare(insertQuery);
BatchStatement …Run Code Online (Sandbox Code Playgroud) 我有一个简单的问题,可能有一个简单的答案,但我找不到它是什么.我们希望将SonarQube与Checkstyle和其他一些工具一起部署,但我们无法找到它是否适用于集中式服务器部署或每台开发人员机器?所有教程都显示在不同机器上的安装并在localhost中使用,而有一个公共实例示例,并且需求和规范肯定看起来像服务一样.
另一方面,我不知道开发人员如何在服务器上提交检查代码.
那么,简而言之,它是如何部署的?任何清单或类似的东西都会有很大的帮助.
假设我有一个对象A,它可能有一个Option B,也可能引用另一个可选对象C(嵌套的选项)
我已经看到了几种访问方式C,比如for-comprehension,模式匹配或者flatMap看起来都很好看.但是,如果我必须返回某种错误消息或抛出异常,如果B或者C丢失或者提供类似cannot execute because B is missing或的消息C not set怎么办?我只能回归(嘲笑):
if(a.b.isDefined)
{
if(a.b.c.isDefined)
{
//do work
}
else throw new Exception1 //or call something other
}
else throw new OtherException //or do something other
Run Code Online (Sandbox Code Playgroud)
我怎么能以功能或更流畅的方式处理?
当我运行我的Kafka Streams应用程序的多个实例时,只有第一个实例正确地接收消息.但是如果我启动新实例,他们就不会收到任何消息.
有没有解决这个问题的建议?
这是我的Kafka流媒体应用程序
package test.kafkastream;
import java.util.Properties;
import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.common.serialization.Serdes;
import org.apache.kafka.streams.KafkaStreams;
import org.apache.kafka.streams.StreamsConfig;
import org.apache.kafka.streams.processor.TopologyBuilder;
public class Main {
public static void main(String[] args) {
Properties props = new Properties();
props.put(StreamsConfig.APPLICATION_ID_CONFIG, "streams-wordcount-processor");
//props.put(ConsumerConfig.GROUP_ID_CONFIG, "streams-wordcount-processor");
props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "192.168.2.38:45983,192.168.2.112:45635,192.168.2.116:39571");
//props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
props.put(StreamsConfig.KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass());
props.put(StreamsConfig.VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass());
//props.put(StreamsConfig.TIMESTAMP_EXTRACTOR_CLASS_CONFIG, MyEventTimeExtractor.class);
// setting offset reset to earliest so that we can re-run the demo code
// with the same pre-loaded data
props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
TopologyBuilder builder = new TopologyBuilder();
builder.addSource("Source", "topic6");
builder.addProcessor("Process", new ProcessMessage(), "Source"); …Run Code Online (Sandbox Code Playgroud) java ×3
apache-kafka ×2
scala ×2
.net ×1
actor ×1
akka ×1
bigdata ×1
c# ×1
cassandra ×1
checkstyle ×1
curl ×1
database ×1
file ×1
file-upload ×1
key-value ×1
rest ×1
security ×1
sonar-runner ×1
sonarqube ×1
webclient ×1